//============================================================================================
/**
 * @file	phclink_sendrecv.c
 * @brief	ＰＨＣ−ＤＳ接続画面 PHC送受信処理 【シーケンス】
 * @author	Akito Mori
 * @date	09.02.02
 */
//============================================================================================
#include "common.h"
#include "gflib/touchpanel.h"
#include "system/gamedata.h"
#include "system/procsys.h"
#include "system/main.h"
#include "system/fontproc.h"
#include "system/window.h"
#include "system/pmfprint.h"
#include "system/snd_tool.h"
#include "system/arc_tool.h"
#include "system/arc_util.h"
#include "system/clact_tool.h"
#include "system/clact_util.h"
#include "system/msgdata_util.h"
#include "system/mystatus.h"
#include "system/wipe.h"
#include "system/lib_pack.h"
#include "gflib/strbuf_family.h"
#include "savedata/config.h"
#include "savedata/tr_house.h"
#include "tr_house/tr_house_phc.h"
#include "itemtool/item.h"
#include "itemtool/myitem.h"
#include "msgdata/msg.naix"
#include "msgdata/msg_phc_com.h"
#include "field/location.h"
#include "field/situation.h"
#include "../../fielddata/maptable/zone_id.h"

#include "application/phclink.h"
#include "phclink_obj_def.h"
#include "phclink_bmp_def.h"
#include "phclink_local.h"
#include "phclink_obj.h"
#include "phclink_bmp.h"
#include "phc_ds.naix"

// デバッグ用に赤外線接続中でも切断できる
//#define DEBUG_DISCONNECT


enum{
	SUBSEQ_MSG=0,
	SUBSEQ_RECV_MSG,
	SUBSEQ_RECV_MSG_WAIT,
	SUBSEQ_POKE_SELECT_FADEOUT,
	SUBSEQ_POKE_SELECT_FADEOUT_WAIT,
	SUBSEQ_RETURN_SELECT_FADEIN,
	SUBSEQ_RETURN_SELECT_FADEIN_WAIT,
	SUBSEQ_SELECT_COURSE_MSG,
	SUBSEQ_SELECT_COURSE_MSG_WAIT,
	SUBSEQ_SELECT_COURSE_INIT,
	SUBSEQ_SELECT_COURSE_WAIT,
	SUBSEQ_SELECT_COURSE_ACTION,

	SUBSEQ_COURSE_DECIDE_YESNO_MSG,
	SUBSEQ_COURSE_DECIDE_YESNO_MSG_WAIT,
	SUBSEQ_COURSE_DECIDE_YESNO_INIT,
	SUBSEQ_COURSE_DECIDE_YESNO_WAIT,

	SUBSEQ_FIRST_PHCLINK_MSG,
	SUBSEQ_FIRST_PHCLINK_MSG_WAIT,

	SUBSEQ_START_IRC_SEND_MSG,
	SUBSEQ_START_IRC_RECV_MSG,

	SUBSEQ_SEND_POKE_MSG,
	SUBSEQ_SEND_POKE_MSG_WAIT,

	SUBSEQ_RECV_PRESENT_MSG,
	SUBSEQ_RECV_PRESENT_MSG_WAIT,

	SUBSEQ_FIRST_IRC_BOOT,
	SUBSEQ_FIRST_IRC_WAIT,
	SUBSEQ_RECV_IRC_BOOT,
	SUBSEQ_RECV_IRC_WAIT,
	SUBSEQ_RECV_PRESENT_IRC_BOOT,
	SUBSEQ_RECV_PRESENT_IRC_WAIT,
	SUBSEQ_SEND_IRC_BOOT,
	SUBSEQ_SEND_IRC_WAIT,
	SUBSEQ_IRC_ERROR_MSG,
	SUBSEQ_IRC_ERROR_END_MSG,
	SUBSEQ_IRC_ERROR_MSG_WAIT,
	SUBSEQ_SEND_SUCCESS_MSG,
	SUBSEQ_SEND_SUCCESS_MSG_WAIT,
	SUBSEQ_RECV_SUCCESS_MSG,
	SUBSEQ_RECV_SUCCESS_MSG_WAIT,
	SUBSEQ_POKEMON_RUNAWAY_MSG,
	SUBSEQ_POKEMON_RUNAWAY_MSG_WAIT,
	SUBSEQ_RECV_PRESENT_SUCCESS_MSG,
	SUBSEQ_RECV_PRESENT_SUCCESS_MSG_WAIT,

	SUBSEQ_CAUTION_MSG,
	SUBSEQ_CAUTION_MSG_WAIT,
	SUBSEQ_OBLIGATE_RECV_YESNO_INIT,
	SUBSEQ_OBLIGATE_RECV_YESNO_WAIT,
	SUBSEQ_OBLIGATE_RECV_MSG,
	SUBSEQ_OBLIGATE_RECV_MSG_WAIT,
	SUBSEQ_OBLIGATE_RECV_SELECT_INIT,
	SUBSEQ_OBLIGATE_RECV_SELECT_WAIT,
	SUBSEQ_OBLIGATE_RECV_SELECT_ACTION,

	SUBSEQ_OBLIGATE_RECV_DEMO_CALL_MSG,
	SUBSEQ_OBLIGATE_RECV_DEMO_INIT,
	SUBSEQ_OBLIGATE_RECV_DEMO,
	SUBSEQ_OBLIGATE_RECV_DEMO_END,
	SUBSEQ_OBLIGATE_RECV_DEMO_END_MSG,
	SUBSEQ_MOVE_RECV_SAVE,

	SUBSEQ_FIRST_IRC_REBOOT_MSG,
	SUBSEQ_SEND_IRC_REBOOT_MSG,
	SUBSEQ_RECV_IRC_REBOOT_MSG,
	SUBSEQ_PRESENT_IRC_REBOOT_MSG,

	SUBSEQ_POKEMON_RUNAWAY_FADEOUT,
	SUBSEQ_POKEMON_RUNAWAY_FADEOUT_WAIT,

	SUBSEQ_MSG_WAIT,
	SUBSEQ_CURSOR_ANIME_WAIT,
	SUBSEQ_END,
	SUBSEQ_MAX,
};

static int SubSeqMsg( PHCLINK_WORK *wk );
static int 	SubSeqRecvMsg( PHCLINK_WORK *wk );
static int 	SubSeqRecvMsgWait( PHCLINK_WORK *wk );

static int SubSeqPokeSelectFadeout( PHCLINK_WORK *wk );
static int SubSeqPokeSelectFadeoutWait( PHCLINK_WORK *wk );

static int SubSeqReturnSelectFadein( PHCLINK_WORK *wk );
static int SubSeqReturnSelectFadeinWait( PHCLINK_WORK *wk );

static int SubSeqSelectCourseMsg( PHCLINK_WORK *wk );
static int SubSeqSelectCourseMsgWait( PHCLINK_WORK *wk );
static int SubSeqSelectCourseInit( PHCLINK_WORK *wk );
static int SubSeqSelectCourseWait( PHCLINK_WORK *wk );
static int SubSeqSelectCourseAction( PHCLINK_WORK *wk );

static int SubSeqCourseDecideYesnoMsg( PHCLINK_WORK *wk );
static int SubSeqCourseDecideYesnoMsgWait( PHCLINK_WORK *wk );
static int SubSeqCourseDecideYesnoInit( PHCLINK_WORK *wk );
static int SubSeqCourseDecideYesnoWait( PHCLINK_WORK *wk );


static int SubSeqFirstPhcLinkMsg( PHCLINK_WORK *wk );
static int SubSeqFirstPhcLinkMsgWait( PHCLINK_WORK *wk );

static int SubSeqStartIrcSendMsg( PHCLINK_WORK *wk );
static int SubSeqStartIrcRecvMsg( PHCLINK_WORK *wk );

static int SubSeqSendPokeMsg( PHCLINK_WORK *wk );
static int SubSeqSendPokeMsgWait( PHCLINK_WORK *wk );

static int SubSeqFirstIrcBoot( PHCLINK_WORK *wk );
static int SubSeqFirstIrcWait( PHCLINK_WORK *wk );
static int SubSeqRecvIrcBoot( PHCLINK_WORK *wk );
static int SubSeqRecvIrcWait( PHCLINK_WORK *wk );
static int SubSeqSendIrcBoot( PHCLINK_WORK *wk );
static int SubSeqSendIrcWait( PHCLINK_WORK *wk );


static int SubSeqIrcErrorMsg( PHCLINK_WORK *wk );
static int SubSeqIrcErrorEndMsg( PHCLINK_WORK *wk );
static int SubSeqIrcErrorMsgWait( PHCLINK_WORK *wk );

static int SubSeqSendSuccessMsg( PHCLINK_WORK *wk );
static int SubseqSendSuccessMsgWait( PHCLINK_WORK *wk );
static int SubSeqRecvSuccessMsg( PHCLINK_WORK *wk );
static int SubSeqRecvSuccessMsgWait( PHCLINK_WORK *wk );
static int SubSeqPokemonRunawayMsg( PHCLINK_WORK *wk );
static int SubSeqPokemonRunawayMsgWait( PHCLINK_WORK *wk );
static int SubSeqRecvPresentSuccessMsg( PHCLINK_WORK *wk );
static int SubSeqRecvPresentSuccessMsgWait( PHCLINK_WORK *wk );

static int SubSeqPokemonRunawayFadeOut( PHCLINK_WORK *wk );
static int SubSeqPokemonRunawayFadeOutWait( PHCLINK_WORK *wk );


static int 	SubSeqCautionMsg( PHCLINK_WORK *wk );
static int 	SubSeqCautionMsgWait( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvYesnoInit( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvYesnoWait( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvMsg( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvMsgWait( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvSelectInit( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvSelectWait( PHCLINK_WORK *wk );
static int 	SubSeqObligateRecvSelectAction( PHCLINK_WORK *wk );
static int SubSeqObligateRecvDemoCallMsg( PHCLINK_WORK *wk );
static int SubSeqObligateRecvDemoInit( PHCLINK_WORK *wk );
static int SubSeqObligateRecvDemo( PHCLINK_WORK *wk );
static int SubSeqOBligateRecvDemoEnd( PHCLINK_WORK *wk );
static int SubSeq_ObligateRecvDemoEndMsg( PHCLINK_WORK *wk );
static int SubSeqMoveRecvSave( PHCLINK_WORK *wk );

static int	SubSeqFirstIrcRebootMsg( PHCLINK_WORK *wk );
static int	SubSeqSendIrcRebootMsg( PHCLINK_WORK *wk );
static int	SubSeqRecvIrcRebootMsg( PHCLINK_WORK *wk );
static int	SubSeqPresentIrcRebootMsg( PHCLINK_WORK *wk );


static int SubSeqMsgWait( PHCLINK_WORK *wk );
static int SubSeqCursorAnimeWait( PHCLINK_WORK *wk );
static int SubSeqEnd( PHCLINK_WORK *wk );

static int SubSeqRecvPresentMsg( PHCLINK_WORK *wk );
static int SubSeqRecvPresentMsgWait( PHCLINK_WORK *wk );
static int SubSeqRecvPresentIrcBoot( PHCLINK_WORK *wk );
static int SubSeqRecvPresentIrcWait( PHCLINK_WORK *wk );
static int _get_select_course( PHCLINK_WORK *wk );
static void _arrow_appear_control( PHCLINK_WORK *wk, int page );


static void _course_explain_write( PHCLINK_WORK *wk, int page, int cursor );
static void _trhouse_data_func( PHCLINK_WORK *wk );
static void _step_calc( PHCLINK_WORK *wk );
static void _watt_calc( PHCLINK_WORK *wk );
static  int RecvPokemonCheck( PHCLINK_WORK *wk );
static  int DecideFunc( PHCLINK_WORK *wk, int pos );
static void ChangeCoursePage( PHCLINK_WORK *wk, int move );
static void blend_poke_func( TCB_PTR tcb, void *ptr );
static void _blendalpha_poke_init( PHCLINK_WORK *wk );
static  int _course_menu_make( PHCLINK_WORK *wk );
static void _make_phc_diary( PHCLINK_WORK *wk );
static void bg1_scrolout_func( TCB_PTR tcb, void *ptr );
static void bg1_scrolin_func( TCB_PTR tcb, void *ptr );
static void _pokemon_stretch_func( PHCLINK_WORK *wk, int total );
static  u16 _phc_proces_total_calc( PHCLINK_WORK *wk, u8 now );
static  int _autogenerate_pokemon_check( PHCLINK_WORK *wk );
static int _distribute_pokemon_check( PHCLINK_WORK *wk );


extern LOCATION_WORK * Situation_GetNowLocation(SITUATION * st);

static int (*SubSeqFuncTbl[])( PHCLINK_WORK *wk )={
	SubSeqMsg,
	SubSeqRecvMsg,
	SubSeqRecvMsgWait,
	SubSeqPokeSelectFadeout,
	SubSeqPokeSelectFadeoutWait,
	SubSeqReturnSelectFadein,
	SubSeqReturnSelectFadeinWait,
	SubSeqSelectCourseMsg,
	SubSeqSelectCourseMsgWait,
	SubSeqSelectCourseInit,
	SubSeqSelectCourseWait,
	SubSeqSelectCourseAction,

	SubSeqCourseDecideYesnoMsg,
	SubSeqCourseDecideYesnoMsgWait,
	SubSeqCourseDecideYesnoInit,
	SubSeqCourseDecideYesnoWait,
	SubSeqFirstPhcLinkMsg,
	SubSeqFirstPhcLinkMsgWait,
	SubSeqStartIrcSendMsg,
	SubSeqStartIrcRecvMsg,
	SubSeqSendPokeMsg,
	SubSeqSendPokeMsgWait,
	SubSeqRecvPresentMsg,
	SubSeqRecvPresentMsgWait,
	SubSeqFirstIrcBoot,
	SubSeqFirstIrcWait,
	SubSeqRecvIrcBoot,
	SubSeqRecvIrcWait,
	SubSeqRecvPresentIrcBoot,
	SubSeqRecvPresentIrcWait,
	SubSeqSendIrcBoot,
	SubSeqSendIrcWait,
	SubSeqIrcErrorMsg,
	SubSeqIrcErrorEndMsg,
	SubSeqIrcErrorMsgWait,
	SubSeqSendSuccessMsg,
	SubseqSendSuccessMsgWait,
	SubSeqRecvSuccessMsg,
	SubSeqRecvSuccessMsgWait,
	SubSeqPokemonRunawayMsg,
	SubSeqPokemonRunawayMsgWait,
	SubSeqRecvPresentSuccessMsg,
	SubSeqRecvPresentSuccessMsgWait,

	SubSeqCautionMsg,
	SubSeqCautionMsgWait,
	SubSeqObligateRecvYesnoInit,
	SubSeqObligateRecvYesnoWait,
	SubSeqObligateRecvMsg,
	SubSeqObligateRecvMsgWait,
	SubSeqObligateRecvSelectInit,
	SubSeqObligateRecvSelectWait,
	SubSeqObligateRecvSelectAction,
	SubSeqObligateRecvDemoCallMsg,
	SubSeqObligateRecvDemoInit,
	SubSeqObligateRecvDemo,
	SubSeqOBligateRecvDemoEnd,
	SubSeq_ObligateRecvDemoEndMsg,
	SubSeqMoveRecvSave,

	SubSeqFirstIrcRebootMsg,
	SubSeqSendIrcRebootMsg,
	SubSeqRecvIrcRebootMsg,
	SubSeqPresentIrcRebootMsg,

	SubSeqPokemonRunawayFadeOut,
	SubSeqPokemonRunawayFadeOutWait,

	SubSeqMsgWait,
	SubSeqCursorAnimeWait,
	SubSeqEnd,
};

#ifdef PM_DEBUG
static void _dump_PHCData( PHCLINK_WORK *wk );
static void _dump_PHCStatus( PHCLINK_WORK *wk );

#endif



//==============================================================================
/**
 * @brief   送受信画面初期化
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  アプリシーケンス
 */
//==============================================================================
int PhcLink_SeqSendRecv_Init( PHCLINK_WORK *wk )
{
	// 上画面ウインドウ面消去とPHC表示
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME0_S, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_S, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_POKEMON_U );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME0_S);
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME1_S);
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME1_M);
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M);

	OS_Printf("PhcLink_SeqSendRecv_Init\n");

	wk->Bg1SubHOffset = 0;

	return SEQ_MAINSEQ_MAIN;
}

//==============================================================================
/**
 * @brief   送受信画面メイン
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  アプリシーケンス
 */
//==============================================================================
int PhcLink_SeqSendRecv_Main( PHCLINK_WORK *wk )
{

	wk->subseq = SubSeqFuncTbl[wk->subseq]( wk );
	if(wk->subseq == SUBSEQ_MAX){
		wk->subseq  = 0;
		return SEQ_MAINSEQ_END;
	}

	// 「光」OBJの制御
	PhcLinkObj_LightObjMain( wk );

	return SEQ_MAINSEQ_MAIN;
}
//==============================================================================
/**
 * @brief   SENDRECVサブプロセス終了
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  アプリシーケンス
 */
//==============================================================================
int PhcLink_SeqSendRecv_End( PHCLINK_WORK *wk )
{
	OS_Printf("PhcLink_SeqSendRecv_End\n");
	wk->Bg1SubHOffset = 0;
	return SEQ_MAINSEQ_INIT;
}



//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================
//==============================================================================



//------------------------------------------------------------------
/**
 * @brief   送信処理シーケンス開始「パソコンからポケモン選んで」
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqMsg( PHCLINK_WORK *wk )
{
	// 受信設定の場合は分岐する
	if(wk->subseq_flag==SENDRECV_RECV){
		// ポケモン受け取り
		// 「PHCつうしんをかいしします」へ
		wk->subseq_next = SUBSEQ_RECV_MSG;
		return SUBSEQ_START_IRC_RECV_MSG;

//		return SUBSEQ_RECV_MSG;
	}else if( wk->subseq_flag==SENDRECV_RECV_PRESENT ){
		// プレゼント受け取り
		// 「PHCつうしんをかいしします」へ
		wk->subseq_next = SUBSEQ_RECV_PRESENT_MSG;
		return SUBSEQ_START_IRC_RECV_MSG;

//		return SUBSEQ_RECV_PRESENT_MSG;
	}else if( wk->subseq_flag==RECVDEMO_OBLIGATE_RECV){
		// 強制送還
		return SUBSEQ_CAUTION_MSG;
	}


	// ここから送信処理
	if(wk->phcsel.monsno!=0){
		return SUBSEQ_RETURN_SELECT_FADEIN;
	}

	// 背景クリア
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );

	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME0_S, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_S, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME0_S );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME1_S );

	// 矢印消去
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );

	// 「パソコンのボックスからポケモンをえらんでください」
//	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_ds_msg_12 );
	PhcLink_MsgStart( wk, PL_BMP_B_TALK, phc_ds_msg_12, SUBSEQ_POKE_SELECT_FADEOUT );

//	PhcLinkObj_PhcAppear( wk, 0 );
	return SUBSEQ_MSG_WAIT;
}



//------------------------------------------------------------------
/**
 * @brief   受け取り開始メッセージ
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqRecvMsg( PHCLINK_WORK *wk )
{

	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );

	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );

	// 「PHCをこちらにむけてボタンを押してください」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_06 );

	// 上画面PHC接続説明表示開始
	PhcLink_AddBg1ScrolTask(wk);

	return SUBSEQ_RECV_MSG_WAIT;
}

//------------------------------------------------------------------
/**
 * @brief   受信メッセージ描画待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqRecvMsgWait( PHCLINK_WORK *wk )
{
	// 受信体制準備
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
		return SUBSEQ_RECV_IRC_BOOT;
	}
	return SUBSEQ_RECV_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  ポケモン選択画面へのフェードアウト開始
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqPokeSelectFadeout( PHCLINK_WORK *wk )
{
	WIPE_SYS_Start(
		WIPE_PATTERN_WMS, WIPE_TYPE_FADEOUT, WIPE_TYPE_FADEOUT,
		WIPE_FADE_BLACK, WIPE_DEF_DIV, WIPE_DEF_SYNC, HEAPID_PHC_LINK );

	return SUBSEQ_POKE_SELECT_FADEOUT_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  ポケモン選択画面へのフェードアウト待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqPokeSelectFadeoutWait( PHCLINK_WORK *wk )
{
	if( WIPE_SYS_EndCheck() == TRUE ){
		wk->mainseq_next = MAINSEQ_POKE_SELECT;
		return SUBSEQ_END;
	}
	return SUBSEQ_POKE_SELECT_FADEOUT_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   フェードイン開始（ポケモン選択からの帰り）
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqReturnSelectFadein( PHCLINK_WORK *wk )
{
	WIPE_SYS_Start(
		WIPE_PATTERN_WMS, WIPE_TYPE_FADEIN, WIPE_TYPE_FADEIN,
		WIPE_FADE_BLACK, WIPE_DEF_DIV, WIPE_DEF_SYNC, HEAPID_PHC_LINK );

	return SUBSEQ_RETURN_SELECT_FADEIN_WAIT;
}

//------------------------------------------------------------------
/**
 * @brief   フェードイン終了待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqReturnSelectFadeinWait( PHCLINK_WORK *wk )
{
	if( WIPE_SYS_EndCheck() == TRUE ){
		MORI_PRINT("monsno=%d, form=%d\n", wk->phcsel.monsno, wk->phcsel.form);
		return SUBSEQ_SELECT_COURSE_MSG;
	}
	return SUBSEQ_RETURN_SELECT_FADEIN_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   「ちずを選んで探索に行く場所を選んでください」表示
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSelectCourseMsg( PHCLINK_WORK *wk )
{
	// 背景クリア
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );

	// 矢印消去
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );

	// 「地図を選んで探検にいく場所を選んでください」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_13 );

	return SUBSEQ_SELECT_COURSE_MSG_WAIT;

}

//------------------------------------------------------------------
/**
 * @brief   メッセージ表示
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSelectCourseMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){

		PhcLinkBmp_Exit( wk, PL_BMP_PAGE_B );		// BMPウィンドウ開放
		PhcLinkBmp_Exit( wk, PL_BMP_PAGE_A );		// BMPウィンドウ開放

		PhcLinkBmp_Init( wk, PL_BMP_PAGE_D );		// BMPウィンドウ初期化
		PhcLinkBmp_Init( wk, PL_BMP_PAGE_C );		// BMPウィンドウ初期化

		return SUBSEQ_SELECT_COURSE_INIT;
	}
	return SUBSEQ_SELECT_COURSE_MSG_WAIT;

}


#define PHC_COURSE_WRITE_MAX	( 5 )		///< １ページに描画するページの最大数

//----------------------------------------------------------------------------------
/**
 * @brief  今のページ数を返す（一つもオープンしていない欄は数えない）
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int _get_course_page( PHCLINK_WORK *wk, int pos )
{
	int n;
	return pos/PHC_COURSE_WRITE_MAX;
}


//----------------------------------------------------------------------------------
/**
 * @brief  コースページ最大数を取得
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int _get_course_page_max( PHCLINK_WORK *wk )
{

	return (wk->menumax-1)/PHC_COURSE_WRITE_MAX+1;
}


//------------------------------------------------------------------
/**
 * @brief   コース名リスト描画処理
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _course_page_string_write( PHCLINK_WORK *wk )
{
	int i,index;
	STRBUF *strbuf;

	// コースリスト描画
	for(i=0;i<PHC_COURSE_WRITE_MAX;i++){
		index = wk->menuitem[i+wk->page*PHC_COURSE_WRITE_MAX];
		if(index>=0){
			strbuf = MSGMAN_AllocString( wk->msg_man, phc_course_name01+index );
		}else{
			strbuf = MSGMAN_AllocString( wk->msg_man, phc_course_unknown );
		}
		PhcLinkBmp_StrPrintColor_M( wk, PL_BMP_D_SELECT_0+i, strbuf, FONT_TOUCH, PHCCOL_B_BLACK );
		STRBUF_Delete(strbuf);
	}

	// ページ描画
	WORDSET_RegisterNumber( wk->wset, 10, wk->page+1, 1,
							NUMBER_DISPTYPE_LEFT, NUMBER_CODETYPE_DEFAULT );
	WORDSET_RegisterNumber( wk->wset, 11, _get_course_page_max(wk), 1,
							NUMBER_DISPTYPE_LEFT, NUMBER_CODETYPE_DEFAULT );
	strbuf = MSGDAT_UTIL_AllocExpandString( wk->wset, wk->msg_man, phc_ds_page, HEAPID_PHC_LINK );
	PhcLinkBmp_StrPrintColor_M( wk, PL_BMP_D_PAGE, strbuf, FONT_SYSTEM, PHCCOL_N_BLACK );
	STRBUF_Delete(strbuf);

	_course_explain_write( wk, wk->page, wk->cursor_pos );
}


//------------------------------------------------------------------
/**
 * @brief   コース名・説明上画面描画処理
 *
 * @param   wk		PHC画面ワーク
 * @param   page	ページ数
 * @param   cursor	カーソル位置
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _course_explain_write( PHCLINK_WORK *wk, int page, int cursor )
{
	STRBUF *strbuf;

	if(cursor==5 ||( _get_select_course(wk) ==-1)){
		// 「−−−−−」描画
		strbuf = MSGMAN_AllocString( wk->msg_man, phc_course_unknown );

		PhcLinkBmp_StrPrintColor_S( wk, PL_BMP_C_PLACE_NAME, strbuf, FONT_SYSTEM, PHCCOL_T_BLACK );
		STRBUF_Delete(strbuf);

		GF_BGL_BmpWinDataFill( &wk->SubBmpWin[PL_BMP_C_PLACE_EXPLAIN], 0 );
		GF_BGL_BmpWinOn(&wk->SubBmpWin[PL_BMP_C_PLACE_EXPLAIN]);

		return;
	}

	// コース名描画
	strbuf = MSGMAN_AllocString( wk->msg_man,
								 phc_course_name01+_get_select_course(wk) );

	PhcLinkBmp_StrPrintColor_S( wk, PL_BMP_C_PLACE_NAME, strbuf, FONT_SYSTEM, PHCCOL_T_BLACK );
	STRBUF_Delete(strbuf);

	// コース説明描画
	strbuf = MSGMAN_AllocString( wk->msg_man,
								 phc_course_caption01+_get_select_course(wk) );
	PhcLinkBmp_StrPrintColor_S( wk, PL_BMP_C_PLACE_EXPLAIN, strbuf, FONT_SYSTEM, PHCCOL_T_BLACK );
	STRBUF_Delete(strbuf);


}

// 地図選択カーソル移動用テーブル
static const course_cur_tbl[]={
	6,7,8,9,10,3,
};


//----------------------------------------------------------------------------------
/**
 * @brief  オープンしているコースだけを配列を格納する
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		コースの数
 */
//----------------------------------------------------------------------------------
static int _course_menu_make( PHCLINK_WORK *wk )
{
	int i,n=0;

	wk->page=0;
	wk->cursor_pos = 0;

	// メニューアイテムを一旦クリア
	MI_CpuFill8(wk->menuitem, -1, COUSE_SELECT_MENUITEM_MAX );

	n=0;
	for(i=0;i<PHCLINK_COURSE_MAX;i++){
		if(PhcSvData_GetCourseOpenFlag(wk->phc_svdata, i)){
			wk->menuitem[n] = i;
			n++;
		}
	}

	return n;
}

//------------------------------------------------------------------
/**
 * @brief   コース選択処理初期化
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSelectCourseInit( PHCLINK_WORK *wk )
{
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 16, 32, 8, GF_BGL_SCRWRT_PALNL );

	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME1_S, NARC_phc_ds_phcds_win02_u_lz_nscr );
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_course_d_lz_nscr );

	// カーソル表示・ページ位置初期化
	wk->menumax = _course_menu_make(wk);

	_course_page_string_write(wk);

	PhcLinkBmp_CancelPrint( wk, PL_BMP_D_CANCEL );			// 「もどる」表示

	// コースが５つ以上存在している場合は矢印表示
	_arrow_appear_control( wk, wk->page );

	PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[wk->cursor_pos]);
//	PhcLinkObj_CursorPosAppearSet( wk, 2 );

	return SUBSEQ_SELECT_COURSE_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  ページ総数・ページ位置でカーソルの表示非表示を制御する
 *
 * @param   wk		PHC画面わーク
 * @param   page	ページ
 */
//----------------------------------------------------------------------------------
static void _arrow_appear_control( PHCLINK_WORK *wk, int page )
{
	int max = _get_course_page_max( wk );

	// カーソルが５以上なら表示
	if(wk->menumax>5){
		if(page==0){
			PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
			PhcLinkObj_Appear( wk, PLOBJ_ID_ARROW_R );

		}else if(page>0 && page<(max-1)){
			PhcLinkObj_Appear( wk, PLOBJ_ID_ARROW_L );
			PhcLinkObj_Appear( wk, PLOBJ_ID_ARROW_R );

		}else if(page==(max-1)){
			PhcLinkObj_Appear( wk, PLOBJ_ID_ARROW_L );
			PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );
		}

	}else{
		// ５つなかったら非表示
		PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );	// 左矢印非表示
		PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );	// 右矢印非表示
	}

}


// ==================================================================
// カーソル位置＋ページ数で現在の選択項目を返す関数
// ==================================================================
//----------------------------------------------------------------------------------
/**
 * @brief	カーソル位置＋ページ数で現在の選択項目を返す関数
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	現在選択しているコース番号
 */
//----------------------------------------------------------------------------------
static int _get_select_course( PHCLINK_WORK *wk )
{
	return wk->menuitem[wk->page*5+wk->cursor_pos];
}


#define PHC_COURSE_LAST_PAGE	( 6 )	///< PHCコースが全部でたときの最大ページ

//------------------------------------------------------------------
/**
 * @brief   コース選択待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSelectCourseWait(  PHCLINK_WORK *wk )
{
	u32 touch = PhcLink_GetTouchTrg( PHC_TOUCH_COURSE_MODE );
	if(touch!=RECT_HIT_NONE){
		if(touch>=0 && touch<=4){
			// 選択できるコースか？
			wk->cursor_pos = touch;
			if( _get_select_course(wk)>=0){
				// 他のタッチは決定
				PhcLink_CursorAnimeStart( wk, touch, course_cur_tbl[touch],
										  SUBSEQ_SELECT_COURSE_ACTION );
				Snd_SePlay(SEQ_SE_DP_DECIDE);
				_course_explain_write( wk, wk->page, wk->cursor_pos );
				return SUBSEQ_CURSOR_ANIME_WAIT;
			}else{
				_course_explain_write( wk, wk->page, wk->cursor_pos );
				Snd_SePlay(SEQ_SE_DP_SELECT);
				PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[wk->cursor_pos]);
			}
		}else if(touch==6){
			// 左隣ページへ
			ChangeCoursePage(wk, -1);
			_arrow_appear_control( wk, wk->page );
			PhcLinkObj_AnimSet( wk, PLOBJ_ID_ARROW_L, 2 );
		}else if(touch==7){
			// 右隣ページへ
			ChangeCoursePage(wk,  1);
			_arrow_appear_control( wk, wk->page );
			PhcLinkObj_AnimSet( wk, PLOBJ_ID_ARROW_R, 3 );
		}else{
			// 他のタッチは決定
			PhcLink_CursorAnimeStart( wk, touch, course_cur_tbl[touch],
									  SUBSEQ_SELECT_COURSE_ACTION );
			Snd_SePlay(SEQ_SE_DP_DECIDE);
			return SUBSEQ_CURSOR_ANIME_WAIT;
		}
		return SUBSEQ_SELECT_COURSE_WAIT;
	}

	if(sys.trg&PAD_KEY_UP){
		if(wk->cursor_pos>0){
			wk->cursor_pos--;
			Snd_SePlay(SEQ_SE_DP_SELECT);
		}
		PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[wk->cursor_pos]);
		_course_explain_write( wk, wk->page, wk->cursor_pos );

	}else if(sys.trg&PAD_KEY_DOWN){
		if(wk->cursor_pos<5){
			wk->cursor_pos++;
			Snd_SePlay(SEQ_SE_DP_SELECT);
		}
		PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[wk->cursor_pos]);
		_course_explain_write( wk, wk->page, wk->cursor_pos );
	}else if(sys.trg&PAD_KEY_LEFT){
		ChangeCoursePage(wk, -1);
		_arrow_appear_control( wk, wk->page );
		PhcLinkObj_AnimSet( wk, PLOBJ_ID_ARROW_L, 2 );
	}else if(sys.trg&PAD_KEY_RIGHT){
		ChangeCoursePage( wk, 1 );
		_arrow_appear_control( wk, wk->page );
			PhcLinkObj_AnimSet( wk, PLOBJ_ID_ARROW_R, 3 );
	}else if(sys.trg&PAD_BUTTON_DECIDE){
		// 選択できるコースか？
		if(wk->cursor_pos >4){
			// 他のタッチは決定
			PhcLink_CursorAnimeStart( wk, wk->cursor_pos,
									  course_cur_tbl[wk->cursor_pos],
									  SUBSEQ_SELECT_COURSE_ACTION );
			Snd_SePlay(SEQ_SE_DP_DECIDE);
			return SUBSEQ_CURSOR_ANIME_WAIT;

		}else{
			if( _get_select_course(wk)>=0){
				PhcLink_CursorAnimeStart( wk, wk->cursor_pos,
									  course_cur_tbl[wk->cursor_pos],
									  SUBSEQ_SELECT_COURSE_ACTION );
				Snd_SePlay(SEQ_SE_DP_DECIDE);
				return SUBSEQ_CURSOR_ANIME_WAIT;
			}else{
				Snd_SePlay(SEQ_SE_DP_SELECT);
			}
		}
	}else if(sys.trg&PAD_BUTTON_CANCEL){
		PhcLink_CursorAnimeStart( wk, 5, course_cur_tbl[5],
								  SUBSEQ_SELECT_COURSE_ACTION );
		Snd_SePlay(SEQ_SE_DP_SELECT);
		return SUBSEQ_CURSOR_ANIME_WAIT;
	}

	return SUBSEQ_SELECT_COURSE_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  コース選択の際の決定項目実行
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqSelectCourseAction(  PHCLINK_WORK *wk )
{
	// カーソルオフ
	PhcLinkObj_CursorDisappear( wk );

	switch(wk->cursor_pos){
	case 0: case 1: case 2: case 3: case 4:
		PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[wk->cursor_pos]);
		if(_get_select_course(wk)>=0){
			PhcLinkObj_CursorDisappear( wk );
			GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 16, 32, 8, GF_BGL_SCRWRT_PALNL );

			// コース番号格納
			wk->phcsel.course = _get_select_course(wk);

			return SUBSEQ_COURSE_DECIDE_YESNO_MSG;
		}else{
//			Snd_SePlay(SEQ_SE_DP_SELECT);
		}
		break;
	case 5:
		// パソコンからポケモンをえらんでください
		PhcLinkBmp_Exit( wk, PL_BMP_PAGE_C );		// BMPウィンドウ開放
		PhcLinkBmp_Exit( wk, PL_BMP_PAGE_D );		// BMPウィンドウ開放

		PhcLinkBmp_Init( wk, PL_BMP_PAGE_B );		// BMPウィンドウ初期化
		PhcLinkBmp_Init( wk, PL_BMP_PAGE_A );		// BMPウィンドウ初期化
		wk->phcsel.monsno = 0;

		PhcLinkObj_CursorDisappear( wk );
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 16, 32, 8, GF_BGL_SCRWRT_PALNL );

		return SUBSEQ_MSG;
		break;

	default:
		GF_ASSERT( wk->cursor_pos < 6 );
	}


	return SUBSEQ_SELECT_COURSE_WAIT;


}

#define COURSE_PAGE_NUM ( (PHCLINK_COURSE_MAX/5)+1 )	///< ページ表示の最大数

//----------------------------------------------------------------------------------
/**
 * @brief  移動できるページ番号を格納した配列を作成
 *
 * @param   wk		PHC画面ワーク
 * @param   course	コース番号を格納する配列
 */
//----------------------------------------------------------------------------------
static void _get_real_page( PHCLINK_WORK *wk, s8 *course )
{
	int i,j,result,n=0;
	for(i=0;i<COURSE_PAGE_NUM;i++){
		course[i]=-1;
	}

	for(i=0;i<COURSE_PAGE_NUM;i++){
		result = 0;
		for(j=0;j<5;j++){
			result += PhcSvData_GetCourseOpenFlag(wk->phc_svdata, i*5+j);
		}
		if(result){
			course[n] = i;
			n++;
		}
	}
}

//----------------------------------------------------------------------------------
/**
 * @brief  現在のページは移動可能ページ配列の何番目か
 *
 * @param   course		コース番号が格納された配列
 * @param   page		ページ
 *
 * @retval  int		コース番号（無い場合は-1)
 */
//----------------------------------------------------------------------------------
static int _page_to_index( s8 *course, int page )
{
	int i;
	for(i=0;i<COURSE_PAGE_NUM;i++){
		if(course[i]==page){
			return i;
		}
	}

	GF_ASSERT( i<COURSE_PAGE_NUM );

	return -1;
}
//----------------------------------------------------------------------------------
/**
 * @brief  コースリストを左右に切り替える（リストは5個単位）
 *
 * @param   wk		PHC画面ワーク
 * @param   move	-1:左ページ　+1:右ページ
 */
//----------------------------------------------------------------------------------
static void ChangeCoursePage( PHCLINK_WORK *wk, int move )
{
	s8 work;

	// 左
	if(move<0){
		if(wk->cursor_pos!=5){
			work = wk->page;
			if(work>0){
				wk->page--;
				wk->cursor_pos = 0;
				Snd_SePlay(SEQ_SE_DP_SELECT);
			}
		}

	// 右
	}else{
		if(wk->cursor_pos!=5){
			work = wk->page;
			if(work<(_get_course_page_max( wk )-1)){
				wk->page++;
				wk->cursor_pos = 0;
				Snd_SePlay(SEQ_SE_DP_SELECT);
			}

//			if(wk->page<PHC_COURSE_LAST_PAGE){
//				wk->page++;
//				wk->cursor_pos = 0;
//				Snd_SePlay(SEQ_SE_DP_SELECT);
//			}
		}

	}
	PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[wk->cursor_pos]);
	_course_page_string_write( wk );
//	_course_explain_write( wk, wk->page, wk->cursor_pos );

}

//----------------------------------------------------------------------------------
/**
 * @brief  コース選択決定時の処理
 *
 * @param   wk		PHC画面ワーク
 * @param   pos		カーソル位置
 *
 * @retval  int		サブシーケンス
 */
//----------------------------------------------------------------------------------
static int DecideFunc( PHCLINK_WORK *wk, int pos )
{
	// 戻る
	switch(pos){
	case 0: case 1: case 2: case 3: case 4:
		wk->cursor_pos = pos;
		PhcLinkObj_CursorPosAppearSet( wk, course_cur_tbl[pos]);
		if(_get_select_course(wk) < 0){
			PhcLinkObj_CursorDisappear( wk );
			GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 16, 32, 8, GF_BGL_SCRWRT_PALNL );

			// コース番号格納
			wk->phcsel.course = _get_select_course(wk);
			Snd_SePlay(SEQ_SE_DP_DECIDE);

			return SUBSEQ_COURSE_DECIDE_YESNO_MSG;
		}else{
			Snd_SePlay(SEQ_SE_DP_SELECT);
		}
		break;
	case 5:
		// パソコンからポケモンをえらんでください
		PhcLinkBmp_Exit( wk, PL_BMP_PAGE_C );		// BMPウィンドウ開放
		PhcLinkBmp_Exit( wk, PL_BMP_PAGE_D );		// BMPウィンドウ開放

		PhcLinkBmp_Init( wk, PL_BMP_PAGE_B );		// BMPウィンドウ初期化
		PhcLinkBmp_Init( wk, PL_BMP_PAGE_A );		// BMPウィンドウ初期化
		wk->phcsel.monsno = 0;

		PhcLinkObj_CursorDisappear( wk );
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 16, 32, 8, GF_BGL_SCRWRT_PALNL );

		return SUBSEQ_MSG;
		break;
	case 6:
		// 「けってい」ってなってる
		break;
	case 7:
		ChangeCoursePage(wk, -1);
		break;
	case 8:
		ChangeCoursePage(wk,  1);
		break;
	}


	return SUBSEQ_SELECT_COURSE_WAIT;
}


//----------------------------------------------------------------------------------
/**
 *
 * @brief 「○○○コースに　おでかけ　しますか？」
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqCourseDecideYesnoMsg( PHCLINK_WORK *wk )
{
	// 背景クリア
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );

	// 矢印消去
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );

	PhcLinkBmp_Exit( wk, PL_BMP_PAGE_C );		// BMPウィンドウ開放
	PhcLinkBmp_Exit( wk, PL_BMP_PAGE_D );		// BMPウィンドウ開放

	PhcLinkBmp_Init( wk, PL_BMP_PAGE_B );		// BMPウィンドウ初期化
	PhcLinkBmp_Init( wk, PL_BMP_PAGE_A );		// BMPウィンドウ初期化

	// WordSetにコース名格納
	WORDSET_RegisterPhcCourseName( wk->wset, 0,  wk->phcsel.course );

	// 「○○コースにおでかけしますか？」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_ds_msg_22 );

	return	SUBSEQ_COURSE_DECIDE_YESNO_MSG_WAIT;

}

//----------------------------------------------------------------------------------
/**
 * @brief  「○○○コースに　おでかけ　しますか？」表示待ち
 *
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqCourseDecideYesnoMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
		return SUBSEQ_COURSE_DECIDE_YESNO_INIT;
	}
	return	SUBSEQ_COURSE_DECIDE_YESNO_MSG_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  はい・いいえ
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqCourseDecideYesnoInit( PHCLINK_WORK *wk )
{

	PhcLinkBmp_YesnoInit( wk, 0 );

	return SUBSEQ_COURSE_DECIDE_YESNO_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  はい・いいえ待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqCourseDecideYesnoWait( PHCLINK_WORK *wk )
{
	switch(PhcLinkBmp_YesnoWait( wk )){
	case 0:
		// すでにPHCを初期化しているか？
		PhcLinkObj_CursorDisappear( wk );
		if(PhcLink_GetPhcMode( wk )==PHCLINK_ALREADY_ENTRY){
			// してるの送信メッセージ処理へ
			wk->subseq_next = SUBSEQ_SEND_POKE_MSG;
			return SUBSEQ_START_IRC_SEND_MSG;
		}else{
			// してないので初期化&送信画面用メッセージへ
			wk->subseq_next = SUBSEQ_FIRST_PHCLINK_MSG;
			return SUBSEQ_START_IRC_SEND_MSG;
		}
		break;
	case 1:
		// 「コースを選んでください」に戻る
		PhcLinkObj_CursorDisappear( wk );
		return SUBSEQ_SELECT_COURSE_MSG;
		break;
	}

	return SUBSEQ_COURSE_DECIDE_YESNO_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   「はじめての場合は1秒以上時間がかかります」表示
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqFirstPhcLinkMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME0_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME2_M );

	// 矢印消去
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );

	// 上画面PHC接続説明表示開始
	PhcLink_AddBg1ScrolTask(wk);

	// 「はじめての場合は1秒以上時間がかかります」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_08 );
	return 	SUBSEQ_FIRST_PHCLINK_MSG_WAIT;

}

//------------------------------------------------------------------
/**
 * @brief   メッセージ表示待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqFirstPhcLinkMsgWait( PHCLINK_WORK *wk )
{

	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0 && wk->blend_rate==31 && wk->Bg1SubHOffset==256){

		// 「もどる」ボタンだけ
		PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
		PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );

		return SUBSEQ_FIRST_IRC_BOOT;
	}

	return SUBSEQ_FIRST_PHCLINK_MSG_WAIT;

}

//----------------------------------------------------------------------------------
/**
 * @brief 送信時「DSとPHCのつうしんをはじめます」を表示
 *		  ※このシーケンスは特殊シーケンスです。
 *			このシーケンスに来た時には既にwk->subseq_nextに次のシーケンスが
 *			設定されている必要があります。
 *			このシーケンスでメッセージを開始した際に再度wk->subseq_nextに自分で
 *			自分への代入が行われます。
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqStartIrcSendMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME0_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME2_M );

	// 矢印消去
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );

	// 半透明でポケモン登場
	_blendalpha_poke_init(wk);

	// メッセージ表示スタート（この関数の最後が特殊）
	PhcLink_MsgStart( wk, PL_BMP_B_TALK, phc_ds_msg_17, wk->subseq_next );	/*SUBSEQ_SEND_POKE_MSG*/

	return SUBSEQ_MSG_WAIT;
}

//----------------------------------------------------------------------------------
/**
 * @brief 送信時「DSとPHCのつうしんをはじめます」を表示
 *		  ※このシーケンスは特殊シーケンスです。
 *			このシーケンスに来た時には既にwk->subseq_nextに次のシーケンスが
 *			設定されている必要があります。
 *			このシーケンスでメッセージを開始した際に再度wk->subseq_nextに自分で
 *			自分への代入が行われます。
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//----------------------------------------------------------------------------------
static int SubSeqStartIrcRecvMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME0_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME2_M );

	// メッセージ表示スタート（この関数の最後が特殊）
	PhcLink_MsgStart( wk, PL_BMP_B_TALK, phc_ds_msg_17, wk->subseq_next );

	return SUBSEQ_MSG_WAIT;
}


//------------------------------------------------------------------
/**
 * @brief   送信時メッセージ開始「おでかけボールをこちらにむけて…」
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSendPokeMsg( PHCLINK_WORK *wk )
{

	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );

	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );

	// 「おでかけボールをこちらにむけてボタンをおしてください」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_06 );

	// 上画面PHC接続説明表示開始
	PhcLink_AddBg1ScrolTask(wk);

	return 	SUBSEQ_SEND_POKE_MSG_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   送信時メッセージ表示待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqSendPokeMsgWait( PHCLINK_WORK *wk )
{


	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0 && wk->blend_rate==31 && wk->Bg1SubHOffset==256){

		return SUBSEQ_SEND_IRC_BOOT;
	}

	return SUBSEQ_SEND_POKE_MSG_WAIT;

}

//=============================================================================================
/**
 * @brief  半透明ポケモン処理を外部からも呼び出せるように
 *
 * @param   wk		PHC画面ワーク
 */
//=============================================================================================
void PhcLink_BlendPokeInit( PHCLINK_WORK *wk )
{
	_blendalpha_poke_init( wk );
}


//----------------------------------------------------------------------------------
/**
 * @brief  半透明OBJ制御開始
 *
 * @param   wk		PHC画面ワーク
 */
//----------------------------------------------------------------------------------
static void _blendalpha_poke_init( PHCLINK_WORK *wk )
{
	void *ptr;
	// ポケモン正面絵転送
	PhcLink_TransPokeGra( wk->ppp, wk->PokeGra, &wk->PokeGraSsa, 0 );

	// ポケモン正面絵を表示＆半透明OBJ扱いに
	CATS_ObjectObjModeSetCap( wk->cap[PLOBJ_ID_POKEMON_D], GX_OAM_MODE_XLU );
	PhcLinkObj_Appear( wk, PLOBJ_ID_POKEMON_D );

	// 半透明設定
	wk->blend_rate = 0;
	G2_SetBlendAlpha(    0, GX_BLEND_PLANEMASK_BG3, 0, 31);

	// 半透明タスク登録
	wk->blend_task = TCB_Add( blend_poke_func, wk, 2);

}


//----------------------------------------------------------------------------------
/**
 * @brief  ポケモン正面絵OBJの半透明度を操作するタスク
 *
 * @param   tcb		タスクポインタ
 * @param   ptr		PHC画面ワークのポインタをもらっている
 */
//----------------------------------------------------------------------------------
static void blend_poke_func( TCB_PTR tcb, void *ptr )
{
	PHCLINK_WORK *wk = (PHCLINK_WORK*)ptr;

	wk->blend_rate+=2;
	if(wk->blend_rate>=31){
		wk->blend_rate=31;
	}
	G2_SetBlendAlpha(    0, GX_BLEND_PLANEMASK_BG3, wk->blend_rate, 31-wk->blend_rate);

	// 通常表示まで到達したら自殺
	if(wk->blend_rate==31){
		TCB_Delete(tcb);
	}
}


//----------------------------------------------------------------------------------
/**
 * @brief  上画面背景をスクロールインさせる
 *
 * @param   tcb		タスクポインタ
 * @param   ptr		PHC画面ワークのポインタをもらっている
 */
//----------------------------------------------------------------------------------
static void bg1_scrolin_func( TCB_PTR tcb, void *ptr )
{
	PHCLINK_WORK *wk = (PHCLINK_WORK*)ptr;

	wk->Bg1SubHOffset += 16;
	if(wk->Bg1SubHOffset>256){
		wk->Bg1SubHOffset=256;
		TCB_Delete(tcb);
	}
}

//----------------------------------------------------------------------------------
/**
 * @brief  上画面背景をスクロールインさせる
 *
 * @param   tcb		タスクポインタ
 * @param   ptr		PHC画面ワークのポインタをもらっている
 */
//----------------------------------------------------------------------------------
static void bg1_scrolout_func( TCB_PTR tcb, void *ptr )
{
	PHCLINK_WORK *wk = (PHCLINK_WORK*)ptr;

	wk->Bg1SubHOffset += 32;
	if(wk->Bg1SubHOffset>512){
		wk->Bg1SubHOffset=512;
		TCB_Delete(tcb);
	}
}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受け取りメッセージ開始
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqRecvPresentMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME0_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_S );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME2_M );

	PhcLinkBmp_Exit( wk, PL_BMP_PAGE_C );		// BMPウィンドウ開放
	PhcLinkBmp_Exit( wk, PL_BMP_PAGE_D );		// BMPウィンドウ開放

	PhcLinkBmp_Init( wk, PL_BMP_PAGE_A );		// BMPウィンドウ初期化
	PhcLinkBmp_Init( wk, PL_BMP_PAGE_B );		// BMPウィンドウ初期化

	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );


	// 矢印消去
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );

	// 上画面PHC接続説明表示開始
	PhcLink_AddBg1ScrolTask(wk);

	// 「おでかけボールをこちらにむけてボタンをおしてください」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_06 );
	return SUBSEQ_RECV_PRESENT_MSG_WAIT;
}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受け取りメッセージ待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqRecvPresentMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0 && wk->Bg1SubHOffset==256){
		PhcLinkObj_PhcAppear( wk, 2 );
		return SUBSEQ_RECV_PRESENT_IRC_BOOT;
	}
	return SUBSEQ_RECV_PRESENT_MSG_WAIT;

}


static void _connect_check_init( PHCLINK_WORK *wk )
{
	wk->error_msg   = 0;
	wk->connect_msg = 0;

}

//------------------------------------------------------------------
/**
 * @brief   PHCライブラリ起動(初期化・送信用）
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqFirstIrcBoot( PHCLINK_WORK *wk )
{
	// PHCから受信データ領域をクリア
	MI_CpuClearFast( &wk->phcsys.Distribute, sizeof(PHCDistributeData));
	MI_CpuClearFast( &wk->phcsys.Data, 		 sizeof(PHCData));


	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );

	// 初めてのPHC送信用初期化
	PhcLink_IRCInitSetup(wk);
	PHC_Entry(&wk->phcsys.myImageData, &wk->phcsys.myCourse, &wk->phcsys.myRecord );
	PhcLink_IrcSystemInit( wk );

	PhcLinkObj_PhcAppear(wk, 2);

	CATS_ObjectAnimeSeqSetCap( wk->cap[PLOBJ_ID_POKEMON_D], 25 );
	CATS_ObjectAnimeFrameSetCap( wk->cap[PLOBJ_ID_POKEMON_D], 0 );

	// エラー監視用ワークを初期化
	_connect_check_init( wk );

	return SUBSEQ_FIRST_IRC_WAIT;
}


//=============================================================================================
/**
 * @brief  PHC接続説明BG転送・タスク開始
 *
 * @param   wk		PHC画面ワーク
 */
//=============================================================================================
void PhcLink_AddBg1ScrolTask( PHCLINK_WORK *wk )
{

	// 上画面説明画像転送
	PhcLink_SetIrcExplainBg( wk );

	// BG1スクロールタスク登録
	wk->scrol_task = TCB_Add( bg1_scrolin_func, wk, 2);

}

//----------------------------------------------------------------------------------
/**
 * @brief  通信時SEを鳴らす関数
 *
 * @param   total	通信の進行具合
 */
//----------------------------------------------------------------------------------
static void _connect_se( int total )
{
	if(total!=0){
		if(Snd_SePlayCheck( SEQ_SE_GS_PHC_POKEMONIDOU )==FALSE){
			Snd_SePlay( SEQ_SE_GS_PHC_POKEMONIDOU );
		}
	}

}

//----------------------------------------------------------------------------------
/**
 * @brief  通信状況の数値を最大値のまま保持し続けさせる
 *
 * @param   wk		PHC画面ワーク
 * @param   now		赤外線通信処理の進行具合(0-255,0-50ぐらいを繰り返してしまう）
 *
 * @retval  u16		0-255の値に丸め込む
 */
//----------------------------------------------------------------------------------
static u16 _phc_proces_total_calc( PHCLINK_WORK *wk, u8 now )
{
	u16 result=0;

	// 接続されている間は最大数値を取り続ける
	// （0..128..255..0..30)となっていても(0..128..255..255..255)をキープ
	if(PHC_IsConnect()){
		if(wk->phcsys.proces_total < now){
			wk->phcsys.proces_total = now;
			result           = now;
		}else{
			result = wk->phcsys.proces_total;
		}
	}else{
		wk->phcsys.proces_total = 0;
		result           = now;
	}

	OS_Printf("connect=%d, n=%d, result=%d\n", PHC_IsConnect(), now, result);
	return result;
}


static int debug_eff=0;
//------------------------------------------------------------------
/**
 * @brief   初回送信待ち
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqFirstIrcWait( PHCLINK_WORK *wk )
{
	int error;
 	u8 proces = PHC_GetProcess();		// プロセスバー表示用データ単位の処理進行度取得(0-255が返る255 で終了)
  	u8 total  = PHC_GetTotalProcess();	// プロセスバー表示用トータル処理進行度取得(0-255が返る255 で終了)
	total = _phc_proces_total_calc( wk, total );

	// 光の生成
	if(total > (gf_mtRand()%255)){
		PhcLinkObj_LightObjBirth( wk );
	}

	// 接続状況でPHCにアニメを変える
	PhcLinkObj_PhcIrcAnime( wk );

#if 0

	if(sys.cont&PAD_KEY_UP){
		debug_eff++;
		if(debug_eff>255){
			debug_eff=255;
		}
	}else if(sys.cont&PAD_KEY_DOWN){
		debug_eff--;
		if(debug_eff<0){
			debug_eff=0;
		}
	}

	if(debug_eff ){
		if(debug_eff<gf_mtRand()%255){
			PhcLinkObj_LightObjBirth( wk );
		}
	}
#endif

	_connect_se(total);

	// ポケモンの姿を縮小する
	_pokemon_stretch_func( wk, total );

	// ポケモン縮小後光の玉が現れる
	if(total>200){
		if(wk->pokelump_flag == 0){
			PhcLinkObj_PokeLumpInit( wk, &wk->pokelump, 2 );
			wk->pokelump_flag = 1;
		}
	}else{
		PhcLinkObj_PokeLumpDisappear( wk );
		wk->pokelump_flag = 0;
	}

	error = PHC_GetError();
	switch(error){
	  case PHC_ERROR_NONE:						// エラーなし
		break;
	  case PHC_ERROR_NOTCONNECT:		// 接続中でない
		break;
	  case PHC_ERROR_TIMEOUT:			// タイムアウトエラー
		if(wk->connect_msg==1){
			wk->error_msg = phc_error_10;
		}
		break;

	  case PHC_ERROR_CHECKSUM:			// チェックサムエラー(IRCのチェックサムとは別)
		break;
	  case PHC_ERROR_INITIALIZED:		// 既に登録済み(登録時)
//	  case PHC_ERROR_NOT_INITIALIZED:	// 未登録(登録時以外)
	  case PHC_ERROR_NOT_EMPTY:			// ポケモンを預かっているPHC
	  case PHC_ERROR_MUCH_COUNTRY:		// 国一致チェックエラー
	  case PHC_ERROR_MUCH_ROM:			// ROMバージョン一致チェックエラー
	  case PHC_ERROR_MUCH_TRAINER:		// トレーナーID 一致チェックエラー
	  case PHC_ERROR_MUCH_UNIT:				// この機器 とは通信できない
	  case PHC_ERROR_EVENT_ALREADY:		// この配布データは既に受け取っている

		wk->error_msg = error;
		break;

	  case PHC_ERROR_MUCH_PHC:			// PHCがDSの送ったステータスにNGを返してきた
		break;
	  case PHC_ERROR_DONE:				// 正常終了

		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );

		// 受け取った時しか入らないのでここで監視することはない
		OS_Printf("送信正常終了\n");
  		{
			int i;
			OS_Printf("RecvFlag=");
			for(i=0;i<16;i++){
				OS_Printf("%02x,",wk->phcsys.myStatusDS.eventReceiveFlag[i]);
			}
			OS_Printf("\n");
		}
		// 登録状態フラグ(1bit)
  		OS_Printf("entry=%d\n",wk->phcsys.myStatusDS.entryFlag);
		// 保持ポケモンフラグ
		OS_Printf("poke=%d\n",wk->phcsys.myStatusDS.pokeFlag);
		// 保持ポケモン自動生成フラグ(DS側はセット不要)
		OS_Printf("generate=%d\n",wk->phcsys.myStatusDS.pokeAutoGenerateFlag);

		// 預けた回数を増やす
		PhcSvData_IncPhcDepositNum( wk->phc_svdata );

		// ポケモン隠す
		PhcLinkObj_Disappear( wk, PLOBJ_ID_POKEMON_D );
		PhcLinkObj_PokeLumpInit( wk, &wk->pokelump, 0 );

		return SUBSEQ_SEND_SUCCESS_MSG;

		break;

	}

	// エラーチェック
	if(wk->error_msg){

		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );
		wk->subseq_next = SUBSEQ_FIRST_IRC_REBOOT_MSG; /*SUBSEQ_FIRST_IRC_REBOOT;*/
		PHC_Dispose();
		return SUBSEQ_IRC_ERROR_MSG;
	}

	// 自分で中断チェック
	if(!PHC_IsConnect()){
		PhcLink_SetIrcExplainVisible( wk, 1 );
		if((PhcLink_GetTouchTrg( PHC_TOUCH_CANCEL_MODE )==0)
		 || (sys.trg & PAD_BUTTON_DECIDE) || (sys.trg & PAD_BUTTON_CANCEL) ){
			wk->error_msg   = phc_error_01;
			PHC_Dispose();
			PhcLink_CursorAnimeStart( wk, 3, 3, SUBSEQ_IRC_ERROR_END_MSG );
			Snd_SePlay(SEQ_SE_DP_DECIDE);
			return SUBSEQ_CURSOR_ANIME_WAIT;
		}
	}else{
		if( wk->connect_msg ==0){
//			PhcLinkBmp_StrPrint_M( wk, PL_BMP_B_TALK, STRBUF *str, int font );
			PhcLinkBmp_TalkWinPrintOnce( wk, PL_BMP_B_TALK, phc_ds_msg_07);
			wk->connect_msg = 1;
		}
		PhcLink_SetIrcExplainVisible( wk, 0 );

	}
	return SUBSEQ_FIRST_IRC_WAIT;
}


#define PHC_DIARY_MAX	( 24 )		///< PHC日記の最大数
//------------------------------------------------------------------
/**
 * @brief   PHC起動（受信用）
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	サブシーケンス
 */
//------------------------------------------------------------------
static int SubSeqRecvIrcBoot( PHCLINK_WORK *wk )
{
	// 日記データをクリアする
	MI_CpuClearFast( wk->phcsys.Data.diary, sizeof(PHCDiary)*PHC_DIARY_MAX );

	// ポケモンを引き取る
	PHC_Back( &wk->phcsys.Rental, &wk->phcsys.Data, &wk->phcsys.Distribute, wk->phcsys.Record);
	PhcLink_IrcSystemInit( wk );

	// エラー監視用ワークを初期化
	_connect_check_init( wk );

	// 後ろでＰＨＣ表示開始
	PhcLinkObj_PhcAppear(wk, 2);

	// 受け取ったポケモンの表示倍率をリセットしておく
	CATS_ObjectAnimeFrameSetCap( wk->cap[PLOBJ_ID_POKEMON_D], 0 );

	return SUBSEQ_RECV_IRC_WAIT;

}

			//



//------------------------------------------------------------------
/**
 * @brief   トレーナーハウスデータ作成・歩数カウント共通処理
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _trhouse_data_func( PHCLINK_WORK *wk )
{
	int i;
	SITUATION     *situation = SaveData_GetSituation(wk->savedata);
	LOCATION_WORK *location  = Situation_GetNowLocation( situation );


	// トレーナーハウスB1内でセーブしているときはトレーナーデータを取り込まない
	if(location->zone_id==ZONE_ID_T02R0302){
		OS_Printf("ここはトレーナーハウス！更新は行わない！");
		return;
	}

	// トレーナーハウスへのデータ代入
	for(i=PHC_TR_HOUSE_NUM-1;i>=0;i--){
		OS_Printf("トレーナーデータは?:%d,ver=%d\n",i+1,wk->phcsys.Record[i+1].romVersion);

		if(wk->phcsys.Record[i+1].romVersion==VERSION_GOLD
		||	wk->phcsys.Record[i+1].romVersion==VERSION_SILVER){
			OS_Printf("トレーナーデータ投げた:%d,ver=%d\n",i+1,wk->phcsys.Record[i+1].romVersion);
			TrHousePHC_TrainerDataSave( wk->savedata, &wk->phcsys.Record[i+1].record );
		}
	}


	// 取得したアイテム
	for(i=0;i<3;i++){
		OS_Printf("d_item[%d]=%d\n", wk->phcsys.Data.item[i].ID);
	}
	for(i=0;i<10;i++){
		OS_Printf("p_item[%d]=%d\n", wk->phcsys.Data.itemFriend[i].ID);
	}
}

//----------------------------------------------------------------------------------
/**
 * @brief  歩数加算処理（プレゼント通信では呼ばない）
 *
 * @param   wk	PHC画面ワーク
 */
//----------------------------------------------------------------------------------
static void _step_calc( PHCLINK_WORK *wk )
{
	// 歩数をセーブデータに格納
	PhcSvData_GetTotalStepWat( wk->phc_svdata, &wk->phcsys.old_total_step, &wk->phcsys.old_total_wat );

	OS_Printf("step差分は = %d, wat = %d\n", wk->phcsys.myStatusPHC.totalStep-wk->phcsys.old_total_step,
											wk->phcsys.Data.watt);

	// 保存されている歩数よりも少ない数が返ってきた場合は登録しない
	if(wk->phcsys.myStatusPHC.totalStep < wk->phcsys.old_total_step){
		PhcSvData_SetTotalStepWat( wk->phc_svdata, wk->phcsys.old_total_step, wk->phcsys.Data.watt );
	}else{
		// 歩数もワットも登録
		PhcSvData_SetTotalStepWat( wk->phc_svdata, wk->phcsys.myStatusPHC.totalStep, wk->phcsys.Data.watt );
	}
}



//----------------------------------------------------------------------------------
/**
 * @brief  ワットのみ加算処理(プレゼント通信専用）
 *
 * @param   wk		PHC画面ワーク
 */
//----------------------------------------------------------------------------------
static void _watt_calc( PHCLINK_WORK *wk )
{
	// ワットだけセーブデータに加算する
	PhcSvData_GetTotalStepWat( wk->phc_svdata, &wk->phcsys.old_total_step, &wk->phcsys.old_total_wat );

	// 歩数はそのまま再格納。取得したワットは加算する
	PhcSvData_SetTotalStepWat( wk->phc_svdata, wk->phcsys.old_total_step, wk->phcsys.Data.watt );

}


//----------------------------------------------------------------------------------
/**
 * @brief  自動生成ポケモン情報チェック
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	TRUE:OK,  FALSE:NG
 */
//----------------------------------------------------------------------------------
static int _autogenerate_pokemon_check( PHCLINK_WORK *wk )
{

	// 自動生成ポケモンか
	if(wk->phcsys.myStatusPHC.pokeAutoGenerateFlag==1){
		// ポケモンNOが範囲外なら取得したポケモンを受け取らない
		if(wk->phcsys.Rental.pokemon.id==0
		|| wk->phcsys.Rental.pokemon.id > MONSNO_END){
			return FALSE;
		}
	}
	return TRUE;
}

//----------------------------------------------------------------------------------
/**
 * @brief  配布ポケモンの内容チェック
 *
 * @param   wk	PHC画面ワーク
 *
 * @retval  int	TRUE:OK,  FALSE:NG
 */
//----------------------------------------------------------------------------------
static int _distribute_pokemon_check( PHCLINK_WORK *wk )
{
	// 配布ポケモンの番号範囲チェックを行う
	if(wk->phcsys.Distribute.info.isPokemon==1){
		// ポケモンNOが範囲外なら取得したポケモンを受け取らない
		if(wk->phcsys.Distribute.pokemon.pokemon.id==0
		|| wk->phcsys.Distribute.pokemon.pokemon.id > MONSNO_END){
			return FALSE;
		}
	}
	return TRUE;

}

//------------------------------------------------------------------
/**
 * @brief   PHCポケモン受信待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvIrcWait( PHCLINK_WORK *wk )
{
	int error;
 	u8 proces = PHC_GetProcess();		// プロセスバー表示用データ単位の処理進行度取得(0-255が返る255 で終了)
  	u8 total  = PHC_GetTotalProcess();	// プロセスバー表示用トータル処理進行度取得(0-255が返る255 で終了)


	if(total){
		PhcLinkObj_DownLightObjBirth( wk );

	}

	// 接続状況でPHCにアニメを変える
	PhcLinkObj_PhcIrcAnime( wk );

	_connect_se(total);

	error = PHC_GetError();
	switch(error){
	  case PHC_ERROR_NONE:				// エラーなし
		break;
	  case PHC_ERROR_NOTCONNECT:		// 接続中でない
		break;
	  case PHC_ERROR_TIMEOUT:			// タイムアウトエラー
		if(wk->connect_msg==1){
			wk->error_msg = phc_error_10;
		}
		break;

	  case PHC_ERROR_CHECKSUM:			// チェックサムエラー(IRCのチェックサムとは別)
		break;
	  case PHC_ERROR_INITIALIZED:		// 既に登録済み(登録時)
	  case PHC_ERROR_NOT_INITIALIZED:	// 未登録(登録時以外)
	  case PHC_ERROR_EMPTY:				// ポケモンを預かっていないPHC(引き取り時)
	  case PHC_ERROR_NOT_EMPTY:			// ポケモンを預かっているPHC
	  case PHC_ERROR_MUCH_COUNTRY:		// 国一致チェックエラー
	  case PHC_ERROR_MUCH_ROM:			// ROMバージョン一致チェックエラー
	  case PHC_ERROR_MUCH_TRAINER:		// トレーナーID 一致チェックエラー
	  case PHC_ERROR_MUCH_UNIT:			// この機器 とは通信できない
	  case PHC_ERROR_EVENT_ALREADY:		// この配布データは既に受け取っている

		wk->error_msg = error;
		break;

	  case PHC_ERROR_MUCH_PHC:			// PHCがDSの送ったステータスにNGを返してきた
		break;
	  case PHC_ERROR_DONE:				// 正常終了

		// 受け取った時しか入らないのでここで監視することはない
		OS_Printf("受信正常終了\n");
#ifdef PM_DEBUG
		_dump_PHCStatus( wk );
#endif
		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );
		{
			int i;
			u32 step, wat;

			// 自動生成ポケモンチェック
			if(	_autogenerate_pokemon_check( wk )){
				// 自動生成ポケモンなら種族名を埋め込む
				if(wk->phcsys.myStatusPHC.pokeAutoGenerateFlag==1){
					// Rental構造体に種族名を格納(空なので不具合がある。報酬画面などで使用される）
					MSGDAT_MonsNameGet( wk->phcsys.Rental.pokemon.id, HEAPID_PHC_LINK,
										(STRCODE*)wk->phcsys.Rental.nickname );
				}
			}

			// ポケモン光初期化
			PhcLinkObj_PokeLumpInit( wk, &wk->pokelump, 1 );

			// トレーナーハウスデータ作成処理
			_trhouse_data_func( wk );

			// 歩数カウント処理
			_step_calc( wk );

			// ポケモン帰って来た日記の作成
			_make_phc_diary( wk );

			OS_Printf("total=======================================> %08x\n",wk->phcsys.myStatusPHC.totalStep);
			wk->step_difference	= wk->phcsys.myStatusPHC.totalStep - wk->phcsys.old_total_step;

		}

		return SUBSEQ_RECV_SUCCESS_MSG;

		break;

	}
	OS_Printf("error=%d, error_msg=%d\n", error, wk->error_msg);

	// エラーチェック
	if(wk->error_msg){

		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );
		wk->subseq_next = SUBSEQ_RECV_IRC_REBOOT_MSG; /*SUBSEQ_FIRST_IRC_REBOOT;*/
		PHC_Dispose();
		return SUBSEQ_IRC_ERROR_MSG;
	}

	if(!PHC_IsConnect()){
		PhcLink_SetIrcExplainVisible( wk, 1 );
		if((PhcLink_GetTouchTrg( PHC_TOUCH_CANCEL_MODE )==0)
		 || (sys.trg & PAD_BUTTON_DECIDE) || (sys.trg & PAD_BUTTON_CANCEL) ){
			// ライブラリ終了関数(スレッドが止まります)
			wk->error_msg   = phc_error_01;
			wk->subseq_next = SUBSEQ_END;
			PHC_Dispose();
			PhcLink_CursorAnimeStart( wk, 3, 3, SUBSEQ_IRC_ERROR_END_MSG );
			Snd_SePlay(SEQ_SE_DP_DECIDE);
			return SUBSEQ_CURSOR_ANIME_WAIT;
		}
	}else{
		if( wk->connect_msg ==0){
			PhcLinkBmp_TalkWinPrintOnce( wk, PL_BMP_B_TALK, phc_ds_msg_07);
			wk->connect_msg = 1;
		}
		PhcLink_SetIrcExplainVisible( wk, 0 );
	}

	return SUBSEQ_RECV_IRC_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  PHC日記の作成（戻ってきた日記、配布ポケモンの情報書き換え）
 *
 * @param   wk		PHC画面ワーク
 */
//----------------------------------------------------------------------------------
static void _make_phc_diary( PHCLINK_WORK *wk )
{
	PHC_END_PAGE_DATA data = {0};

	// ＰＨＣ日記に「戻ってきた日記」を作成する
	data.p_myNickName	= (STRCODE*)wk->phcsys.Rental.nickname;
	data.pokeNumber		= wk->phcsys.Rental.pokemon.id;
	data.myFolm			= wk->phcsys.Rental.pokemon.folm;
	data.mySex			= wk->phcsys.Rental.pokemon.sex;
	data.myRareColor	= wk->phcsys.Rental.pokemon.rareColor;

	// 総歩数がDSに残っている歩数よりも少なかったら0にする
	if(wk->phcsys.myStatusPHC.totalStep < wk->phcsys.old_total_step){
		data.myStepDay	= 0;
	}else{
		data.myStepDay	= wk->phcsys.myStatusPHC.totalStep - wk->phcsys.old_total_step;
	}

	// 戻ってきた日記ページ作成
	PhcDiary_SetEndPage( &wk->phcsys.Data.diary[23], &data );

	// 配布ポケモンを受け取っているなら
	if(PhcDiary_CheckSharePokePage( wk->phcsys.Data.diary )){
		PHC_SHARE_POKE_PAGE_DATA dat;

		dat.enemyNumber   = wk->phcsys.Distribute.pokemon.pokemon.id;			///< 自分のポケ ID
		dat.yourFolm      = wk->phcsys.Distribute.pokemon.pokemon.folm;			///< 自分のポケ フォルム
		dat.yourSex       = wk->phcsys.Distribute.pokemon.pokemon.sex;			///< 自分のポケ 性別
		dat.yourRareColor = wk->phcsys.Distribute.pokemon.pokemon.rareColor;	///< 自分のポケ レアカラー

		// 配布ポケモン日記の情報補正関数呼び出し
		PhcDiary_SetSharePokePage( wk->phcsys.Data.diary, &dat );
		OS_Printf("配布ポケモン補正関数呼び出し\n");
	}

}

//------------------------------------------------------------------
/**
 * @brief   プレゼント受信IRC起動
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvPresentIrcBoot( PHCLINK_WORK *wk )
{
	// ワーク消去
	MI_CpuClearFast( &wk->phcsys.Distribute, sizeof(PHCDistributeData));

	// プレゼントを受け取る
	PHC_Present( &wk->phcsys.Data, wk->phcsys.Record);
	PhcLink_IrcSystemInit( wk );

	// エラー監視用ワークを初期化
	_connect_check_init( wk );

	return SUBSEQ_RECV_PRESENT_IRC_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受信処理待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvPresentIrcWait( PHCLINK_WORK *wk )
{
	int error;
 	u8 proces = PHC_GetProcess();		// プロセスバー表示用データ単位の処理進行度取得(0-255が返る255 で終了)
  	u8 total  = PHC_GetTotalProcess();	// プロセスバー表示用トータル処理進行度取得(0-255が返る255 で終了)

	if(total){
		PhcLinkObj_DownLightObjBirth( wk );

	}
	_connect_se(total);

	// 接続状況でPHCにアニメを変える
	PhcLinkObj_PhcIrcAnime( wk );

	error = PHC_GetError();
	switch(error){
	  case PHC_ERROR_NONE:						// エラーなし
		break;
	  case PHC_ERROR_NOTCONNECT:		// 接続中でない
		break;
	  case PHC_ERROR_TIMEOUT:			// タイムアウトエラー
		if(wk->connect_msg==1){
			wk->error_msg = phc_error_10;
		}
		break;

	  case PHC_ERROR_CHECKSUM:			// チェックサムエラー(IRCのチェックサムとは別)
		break;
	  case PHC_ERROR_INITIALIZED:		// 既に登録済み(登録時)
	  case PHC_ERROR_NOT_INITIALIZED:	// 未登録(登録時以外)
	  case PHC_ERROR_NOT_EMPTY:			// ポケモンを預かっているPHC
	  case PHC_ERROR_MUCH_COUNTRY:		// 国一致チェックエラー
	  case PHC_ERROR_MUCH_ROM:			// ROMバージョン一致チェックエラー
	  case PHC_ERROR_MUCH_TRAINER:		// トレーナーID 一致チェックエラー
	  case PHC_ERROR_MUCH_UNIT:				// この機器 とは通信できない
	  case PHC_ERROR_EVENT_ALREADY:		// この配布データは既に受け取っている

		wk->error_msg = error;
		break;

	  case PHC_ERROR_MUCH_PHC:			// PHCがDSの送ったステータスにNGを返してきた
		break;
	  case PHC_ERROR_DONE:				// 正常終了

		// 受け取った時しか入らないのでここで監視することはない
		OS_Printf("受信正常終了\n");
#ifdef PM_DEBUG
		_dump_PHCStatus( wk );
#endif
		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );
		{
			RTCDate date;
			RTCTime time;
			s64 second;
			int i;

			RTC_GetDateTime( &date ,&time );
			second = RTC_ConvertDateTimeToSecond( &date , &time );

			// トレーナーハウスデータ作成・歩数カウント共通処理
			_trhouse_data_func( wk );

			// 歩数処理は呼ばないでワット加算処理を呼ぶ
			_watt_calc( wk );

		}
		// 宝箱出現
		PhcLinkObj_Appear( wk, PLOBJ_ID_TRESURE );
		return 	SUBSEQ_RECV_PRESENT_SUCCESS_MSG;

		break;

	}

	// エラーチェック
	if(wk->error_msg){

		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );
		wk->subseq_next = SUBSEQ_PRESENT_IRC_REBOOT_MSG;
		PHC_Dispose();
		return SUBSEQ_IRC_ERROR_MSG;
	}

	if(!PHC_IsConnect()){
		PhcLink_SetIrcExplainVisible( wk, 1 );
		if((PhcLink_GetTouchTrg( PHC_TOUCH_CANCEL_MODE )==0)
		 || (sys.trg & PAD_BUTTON_DECIDE) || (sys.trg & PAD_BUTTON_CANCEL) ){
			PHC_Dispose();
			wk->error_msg   = phc_error_01;
			wk->subseq_next = SUBSEQ_END;
			PhcLink_CursorAnimeStart( wk, 3, 3, SUBSEQ_IRC_ERROR_END_MSG );
			Snd_SePlay(SEQ_SE_DP_DECIDE);
			return SUBSEQ_CURSOR_ANIME_WAIT;
		}
	}else{
		if( wk->connect_msg ==0){
			PhcLinkBmp_TalkWinPrintOnce( wk, PL_BMP_B_TALK, phc_ds_msg_07);
			wk->connect_msg = 1;
		}
		PhcLink_SetIrcExplainVisible( wk, 0 );
	}

	return SUBSEQ_RECV_PRESENT_IRC_WAIT;

}



//------------------------------------------------------------------
/**
 * @brief   PHC起動（送信用）
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqSendIrcBoot( PHCLINK_WORK *wk )
{
	// 送信データ準備
	PhcLink_IRCSendSetup( wk );


	// ポケモン送信設定
	PHC_Put( &wk->phcsys.myCourse, &wk->phcsys.myRecord, &wk->phcsys.Data, &wk->phcsys.Distribute );
	PhcLink_IrcSystemInit( wk );

	if(wk->pp!=NULL){
		PhcLink_TransPokeGra( (POKEMON_PASO_PARAM*)wk->pp, wk->PokeGra, &wk->PokeGraSsa, 0 );
	}else{
		PhcLink_TransPokeGra( wk->ppp, wk->PokeGra, &wk->PokeGraSsa, 0 );
	}


	// ポケモン正面絵を表示＆半透明OBJ扱いに
	CATS_ObjectObjModeSetCap( wk->cap[PLOBJ_ID_POKEMON_D], GX_OAM_MODE_XLU );
	PhcLinkObj_Appear( wk, PLOBJ_ID_POKEMON_D );

	CATS_ObjectAnimeSeqSetCap( wk->cap[PLOBJ_ID_POKEMON_D], 25 );
	CATS_ObjectAnimeFrameSetCap( wk->cap[PLOBJ_ID_POKEMON_D], 0 );

//	PhcLinkObj_PokeLumpAppear( wk, &wk->pokelump );

	wk->pokelump_flag = 0;

	// 後ろでＰＨＣ表示開始
	PhcLinkObj_PhcAppear(wk, 2);

	// エラー監視用ワークを初期化
	_connect_check_init( wk );

	return SUBSEQ_SEND_IRC_WAIT;

}

//----------------------------------------------------------------------------------
/**
 * @brief  ポケモンの拡大縮小をPHC通信割合で反映させる
 *
 * @param   wk		PHC画面ワーク
 * @param   total	赤外線通信の進行状態(0-255)
 */
//----------------------------------------------------------------------------------
static void _pokemon_stretch_func( PHCLINK_WORK *wk, int total )
{
	if(total==0){
		CATS_ObjectAnimeFrameSetCap( wk->cap[PLOBJ_ID_POKEMON_D], 0 );
	}else if(total>30){
		CATS_ObjectAnimeFrameSetCap( wk->cap[PLOBJ_ID_POKEMON_D], (total-30)/4 );
	}

}




static u8 debug_frame=0;
//------------------------------------------------------------------
/**
 * @brief   PHCポケモン送信待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqSendIrcWait( PHCLINK_WORK *wk )
{
	int error;
 	u8 proces  = PHC_GetProcess();		// プロセスバー表示用データ単位の処理進行度取得(0-255が返る255 で終了)
  	u16 total  = PHC_GetTotalProcess();	// プロセスバー表示用トータル処理進行度取得(0-255が返る255 で終了)
	total = _phc_proces_total_calc( wk, total );

	// 光の生成
	if(total){
		PhcLinkObj_LightObjBirth( wk );
	}

	// 接続状況でPHCにアニメを変える
	PhcLinkObj_PhcIrcAnime( wk );

#if 0
	if(sys.cont&PAD_KEY_UP){
		wk->pokelump.y-=3;
		PhcLinkObj_PokeLumpSetPos( wk, wk->pokelump.x, wk->pokelump.y );
	}
	if(sys.cont&PAD_KEY_DOWN){
		wk->pokelump.y+=3;
		PhcLinkObj_PokeLumpSetPos( wk, wk->pokelump.x, wk->pokelump.y );
	}
	if(sys.cont&PAD_KEY_LEFT){
		wk->pokelump.x-=3;
		PhcLinkObj_PokeLumpSetPos( wk, wk->pokelump.x, wk->pokelump.y );
	}
	if(sys.cont&PAD_KEY_RIGHT){
		wk->pokelump.x+=3;
		PhcLinkObj_PokeLumpSetPos( wk, wk->pokelump.x, wk->pokelump.y );
	}
#endif

	_connect_se( total );

	// ポケモンの姿を縮小する
	_pokemon_stretch_func( wk, total );
	OS_Printf("total=%d\n", total);


	// ポケモン縮小後光の玉が現れる
	if(total>200){
		if(wk->pokelump_flag == 0){
			PhcLinkObj_PokeLumpInit( wk, &wk->pokelump, 2 );
			wk->pokelump_flag = 1;
		}
	}else{
		PhcLinkObj_PokeLumpDisappear( wk );
		wk->pokelump_flag = 0;
	}

	error = PHC_GetError();
	switch(error){
	  case PHC_ERROR_NONE:						// エラーなし
		break;
	  case PHC_ERROR_NOTCONNECT:		// 接続中でない
		break;
	  case PHC_ERROR_TIMEOUT:			// タイムアウトエラー
		if(wk->connect_msg==1){
			wk->error_msg = phc_error_10;
		}
		break;

	  case PHC_ERROR_CHECKSUM:			// チェックサムエラー(IRCのチェックサムとは別)
		break;
	  case PHC_ERROR_INITIALIZED:		// 既に登録済み(登録時)
	  case PHC_ERROR_NOT_INITIALIZED:	// 未登録(登録時以外)
	  case PHC_ERROR_NOT_EMPTY:			// ポケモンを預かっているPHC
	  case PHC_ERROR_MUCH_COUNTRY:		// 国一致チェックエラー
	  case PHC_ERROR_MUCH_ROM:			// ROMバージョン一致チェックエラー
	  case PHC_ERROR_MUCH_TRAINER:		// トレーナーID 一致チェックエラー
	  case PHC_ERROR_MUCH_UNIT:				// この機器 とは通信できない
	  case PHC_ERROR_EVENT_ALREADY:		// この配布データは既に受け取っている

		wk->error_msg = error;
		break;

	  case PHC_ERROR_MUCH_PHC:			// PHCがDSの送ったステータスにNGを返してきた
		break;
	  case PHC_ERROR_DONE:				// 正常終了

		// 受け取った時しか入らないのでここで監視することはない
		OS_Printf("受信正常終了\n");
#ifdef PM_DEBUG
		_dump_PHCStatus( wk );
		_dump_PHCData(wk);
#endif
		OS_Printf("phc step =%d\n", wk->phcsys.myStatusPHC.totalStep);

		// PHCのアニメOFF
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );

		// セーブデータの歩数を比較用に取得
		PhcSvData_GetTotalStepWat( wk->phc_svdata, &wk->phcsys.old_total_step, &wk->phcsys.old_total_wat );

		// 歩数カウント・ワット処理
		_step_calc( wk );


		// 預けた回数を増やす
		PhcSvData_IncPhcDepositNum( wk->phc_svdata );

		// ポケモン隠す
		PhcLinkObj_Disappear( wk, PLOBJ_ID_POKEMON_D );
		PhcLinkObj_PokeLumpInit( wk, &wk->pokelump, 0 );
		return SUBSEQ_SEND_SUCCESS_MSG;

		break;
	}

#ifdef DEBUG_DISCONNECT
		if( sys.trg & PAD_BUTTON_DECIDE ){
			return SUBSEQ_IRC_ERROR_MSG;
		}
#else

	// エラーチェック
	if(wk->error_msg){
		// PHCのアニメを終了
		CATS_ObjectEnableCap( wk->cap[ PLOBJ_ID_PHC_ANIME ], ACT_OFF );
		wk->subseq_next = SUBSEQ_SEND_IRC_REBOOT_MSG;
		PHC_Dispose();
		return SUBSEQ_IRC_ERROR_MSG;
	}

	if(!PHC_IsConnect()){
		PhcLink_SetIrcExplainVisible( wk, 1 );
		if((PhcLink_GetTouchTrg( PHC_TOUCH_CANCEL_MODE )==0)
		 || (sys.trg & PAD_BUTTON_DECIDE) || (sys.trg & PAD_BUTTON_CANCEL) ){
			// ライブラリ終了関数(スレッドが止まります)
			wk->error_msg   = phc_error_01;
			wk->subseq_next = SUBSEQ_END;
			PHC_Dispose();
			PhcLink_CursorAnimeStart( wk, 3, 3, SUBSEQ_IRC_ERROR_END_MSG );
			Snd_SePlay(SEQ_SE_DP_DECIDE);
			return SUBSEQ_CURSOR_ANIME_WAIT;
		}
	}else{
		if( wk->connect_msg ==0){
			PhcLinkBmp_TalkWinPrintOnce( wk, PL_BMP_B_TALK, phc_ds_msg_07);
			wk->connect_msg = 1;
		}
		PhcLink_SetIrcExplainVisible( wk, 0 );
	}
#endif
	return SUBSEQ_SEND_IRC_WAIT;

}



//----------------------------------------------------------------------------------
/**
 * @brief  エラーメッセージ設定関数
 * ※PHCから返ってくるエラーとエラーメッセージの値がかぶっていない事を
 *   期待した動作をしている。（エラーコードは0-16,エラーメッセージＩＤは31-41)
 *
 *
 * @param   error_msg	エラーナンバー
 *
 * @retval  int			実際に表示するエラーメッセージ
 */
//----------------------------------------------------------------------------------
static int _error_msg_set( int error_msg )
{

	switch(error_msg){
	case phc_error_01:
		break;
	case phc_error_10:
		break;
	case PHC_ERROR_INITIALIZED:		// 既に登録済み(登録時)
		error_msg = phc_error_02;
		break;

	case PHC_ERROR_NOT_INITIALIZED:	// 未登録(登録時以外)
		error_msg = phc_error_04;
		break;
	case PHC_ERROR_NOT_EMPTY:			// ポケモンを預かっているPHC
		error_msg = phc_error_05;
		break;
	case PHC_ERROR_EMPTY:				// ポケモンを預かっていないPHC(引き取り時)
		error_msg = phc_error_11;
		break;
	case PHC_ERROR_MUCH_COUNTRY:		// 国一致チェックエラー
	case PHC_ERROR_MUCH_ROM:			// ROMバージョン一致チェックエラー
		error_msg = phc_error_06;
		break;
	case PHC_ERROR_MUCH_TRAINER:		// トレーナーID 一致チェックエラー
	case PHC_ERROR_MUCH_UNIT:				// この機器 とは通信できない
	case PHC_ERROR_CHECKSUM:			// チェックサムエラー(IRCのチェックサムとは別)
		error_msg = phc_error_07;
		break;
	case PHC_ERROR_EVENT_ALREADY:		// この配布データは既に受け取っている
		error_msg = phc_error_03;
		break;

	case PHC_ERROR_MUCH_PHC:			// PHCがDSの送ったステータスにNGを返してきた
		error_msg = phc_error_10;
		break;
	}

	return error_msg;
}

//------------------------------------------------------------------
/**
 * @brief   エラー終了時のメッセージ開始
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqIrcErrorMsg( PHCLINK_WORK *wk )
{

	PhcLinkObj_CursorDisappear( wk );	// カーソル非表示にする

	wk->error_msg = _error_msg_set(wk->error_msg);
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, wk->error_msg );

	return SUBSEQ_IRC_ERROR_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  エラー表示後終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqIrcErrorEndMsg( PHCLINK_WORK *wk )
{
	PhcLinkObj_CursorDisappear( wk );	// カーソル非表示にする

	wk->error_msg   = _error_msg_set(wk->error_msg);
	wk->MsgIndex    = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, wk->error_msg );
	wk->subseq_next = SUBSEQ_END;

	return SUBSEQ_IRC_ERROR_MSG_WAIT;

}

//----------------------------------------------------------------------------------
/**
 * @brief  エラー後の「DSカードをむけてください」の再表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int	SubSeqFirstIrcRebootMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_08 );

	return SUBSEQ_FIRST_PHCLINK_MSG_WAIT;
}
static int	SubSeqSendIrcRebootMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_06 );

	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );

	return SUBSEQ_SEND_POKE_MSG_WAIT;
}
static int	SubSeqRecvIrcRebootMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_06 );

	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );
	return SUBSEQ_RECV_MSG_WAIT;
}
static int	SubSeqPresentIrcRebootMsg( PHCLINK_WORK *wk )
{
	GF_BGL_ScrClear( wk->bgl, GF_BGL_FRAME1_M );
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_06 );

	// 「もどる」ボタンだけ
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_back_d_lz_nscr );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );
	return SUBSEQ_RECV_PRESENT_MSG_WAIT;
}

//------------------------------------------------------------------
/**
 * @brief   エラーメッセージ待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqIrcErrorMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
		wk->mainseq_next = MAINSEQ_START;

		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
		GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );
		wk->subseq = wk->subseq_next;
		return wk->subseq;
	}
	return SUBSEQ_IRC_ERROR_MSG_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   送信成功メッセージ待ち「〜がおくられた！」
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqSendSuccessMsg( PHCLINK_WORK *wk )
{
	// ライブラリ終了関数(スレッドが止まります)
	PHC_Dispose();

	// 配布ポケモンの整合性チェック(おかしい場合はクリアしてしまう）
	if(_distribute_pokemon_check(wk)==FALSE){
		MI_CpuClearFast(&wk->phcsys.Distribute.pokemon, sizeof(PHCDistributePokemon));
		wk->phcsys.Distribute.info.isPokemon = 0;
	}


	// 返ってきたポケモンの名前をWordSetに登録
	if(wk->pp!=NULL){
		WORDSET_RegisterPokeNickName( wk->wset, 1, (POKEMON_PASO_PARAM*)wk->pp );
	}else{
		WORDSET_RegisterPokeNickName( wk->wset, 1, wk->ppp );
	}

	// ボタン消去
	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );

	// メッセージ表示
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_com_msg_02 );

	Snd_MePlay( SEQ_ME_KEYITEM );

	return SUBSEQ_SEND_SUCCESS_MSG_WAIT;
}


//------------------------------------------------------------------
/**
 * @brief   送信デモ＋セーブへ
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubseqSendSuccessMsgWait( PHCLINK_WORK *wk )
{
	int result=PhcLinkObj_PokeLumpMain(wk, &wk->pokelump);
	if(  GF_MSG_PrintEndCheck( wk->MsgIndex )==0
	  && (PhcLinkObj_LightEarlyDie( wk )==0)
	  && Snd_MePlayCheckBgmPlay()==FALSE){
		wk->mainseq_next = MAINSEQ_SEND_DEMO;

		return SUBSEQ_END;
	}
	return SUBSEQ_SEND_SUCCESS_MSG_WAIT;

}


//------------------------------------------------------------------
/**
 * @brief   受信成功メッセージ待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvSuccessMsg( PHCLINK_WORK *wk )
{
	STRBUF *strbuf = STRBUF_Create( BUFLEN_POKEMON_NAME, HEAPID_PHC_LINK );

	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );

	OS_Printf("diary[23]=%d\n",wk->phcsys.Data.diary[23].actionId );

	// 自動生成ポケモンチェック
	if(	_autogenerate_pokemon_check( wk )){

		// 名前の格納
		STRBUF_SetStringCodeOrderLength( strbuf, (STRCODE*)wk->phcsys.Rental.nickname, BUFLEN_POKEMON_NAME );
		WORDSET_RegisterWord( wk->wset, 1, strbuf, wk->phcsys.Rental.pokemon.sex, 1,  LANG_JAPAN );

		// ○○がもどってきた！
		wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_com_msg_04 );
	}else{
		// ポケモンが戻ってきた（不正）
		wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_com_msg_09 );
	}
	// ライブラリ終了関数(スレッドが止まります)
	PHC_Dispose();

#ifdef PM_DEBUG
	// 受け取り情報ダンプ処理
	_dump_PHCData(wk);
	_dump_PHCStatus( wk );
#endif
	STRBUF_Delete( strbuf );

//	Snd_MePlay( SEQ_ME_KEYITEM );

	return SUBSEQ_RECV_SUCCESS_MSG_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  返ってきたポケモンデータは強制送還後ではないか？
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		1:預けたぽけもんか自動生成　0:強制送還後
 */
//----------------------------------------------------------------------------------
static int RecvPokemonCheck( PHCLINK_WORK *wk )
{
	int result = 1;
	POKEMON_PARAM *pp = PokemonParam_AllocWork(HEAPID_PHC_LINK);

	// ポケモンが隠してなくて
	if(PhcSvData_GetPokemon( wk->phc_svdata, (u8*)pp )==0){
		// 強制送還
		result = 0;

	}

	// PHCの中から帰ってきたポケモンの基本情報とセーブデータのポケモンに
	// 食い違いがあったらそれも強制送還（データ復帰させない）
	{
		int monsno,form;
		monsno = PokeParaGet( pp, ID_PARA_monsno, NULL );
		form   = PokeParaGet( pp, ID_PARA_form_no, NULL );

		if( (wk->phcsys.Rental.pokemon.id!=monsno) || (wk->phcsys.Rental.pokemon.folm!=form) ){
			result = 0;
		}
		OS_Printf("phc poke=%d,form=%d, ds poke=%d, form=%d\n",wk->phcsys.Rental.pokemon.id, wk->phcsys.Rental.pokemon.folm, monsno, form);

	}
	sys_FreeMemoryEz( pp );

	return result;
}


//------------------------------------------------------------------
/**
 * @brief   ポケモン受信成功メッセージ待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvSuccessMsgWait( PHCLINK_WORK *wk )
{
	// 強制送還か、正しいポケモンかチェック

	int result = PhcLinkObj_PokeLumpMain( wk, &wk->pokelump );
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0 && Snd_MePlayCheckBgmPlay()==FALSE){

		// 自動生成ポケモン整合性チェック
		if(_autogenerate_pokemon_check( wk )==FALSE){
			// 自動生成ポケモン情報をクリア
			MI_CpuClearFast(&wk->phcsys.Rental.pokemon, sizeof(PHCPokemonBase));
			wk->phcsys.myStatusPHC.pokeAutoGenerateFlag = 0;
		}

		// 配布ポケモンの整合性チェック(おかしい場合はクリアしてしまう）
		if(_distribute_pokemon_check(wk)==FALSE){
			MI_CpuClearFast(&wk->phcsys.Distribute.pokemon, sizeof(PHCDistributePokemon));
			wk->phcsys.Distribute.info.isPokemon = 0;
		}
//
// PHC477:強制引取りを行ったあと、配布どうぐを受信しているPHCから
//        預けていたポケモンをひきとると、配布どうぐが消失してしまう
//
#if GS_PHC477_090707_FIX
		// 正しければセーブへ
		if( RecvPokemonCheck( wk )
			|| wk->phcsys.Distribute.info.isPokemon
			|| wk->phcsys.Distribute.info.isItem
			|| wk->phcsys.myStatusPHC.pokeAutoGenerateFlag){
#else
		// 正しければセーブへ
		if( RecvPokemonCheck( wk )
			|| wk->phcsys.Distribute.info.isPokemon
			|| wk->phcsys.myStatusPHC.pokeAutoGenerateFlag){
#endif
			wk->mainseq_next = MAINSEQ_RECV_DEMO;
			return SUBSEQ_END;
		}else{
			// 強制送還後だったら「やせいに…」メッセージへ
			return SUBSEQ_POKEMON_RUNAWAY_MSG;
		}
	}
	return SUBSEQ_RECV_SUCCESS_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  「…　○○○は　やせいにかえっていった！」表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqPokemonRunawayMsg( PHCLINK_WORK *wk )
{
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_ds_msg_21 );

	return SUBSEQ_POKEMON_RUNAWAY_MSG_WAIT;
}

//----------------------------------------------------------------------------------
/**
 * @brief  「…　○○○は　やせいにかえっていった！」表示待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqPokemonRunawayMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
//		wk->mainseq_next = MAINSEQ_START;
		return SUBSEQ_POKEMON_RUNAWAY_FADEOUT;
	}
	return SUBSEQ_POKEMON_RUNAWAY_MSG_WAIT;
}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受け取り成功メッセージ
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvPresentSuccessMsg( PHCLINK_WORK *wk )
{
	// プレゼントを受け取りました！
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_com_msg_06 );

	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );

	// ライブラリ終了関数(スレッドが止まります)
	PHC_Dispose();

	Snd_MePlay( SEQ_ME_ITEM );

	return SUBSEQ_RECV_PRESENT_SUCCESS_MSG_WAIT;
}


//------------------------------------------------------------------
/**
 * @brief   プレゼント受け取り成功メッセージ待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqRecvPresentSuccessMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0 && Snd_MePlayCheckBgmPlay()==FALSE){
	wk->mainseq_next = MAINSEQ_RECV_DEMO;

		return SUBSEQ_END;
	}

	return SUBSEQ_RECV_PRESENT_SUCCESS_MSG_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  「ちゅうい！ポケモンをきょうせいてきにかえしますか？」表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqCautionMsg( PHCLINK_WORK *wk )
{
//	PhcLinkObj_PhcAppear( wk, 0 );

	// 「ちゅうい！ポケモンをきょうせいてきにかえしますか？」
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_TALK, phc_ds_msg_19 );
	return SUBSEQ_CAUTION_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  「ちゅうい！ポケモンをきょうせいてきにかえしますか？」表示待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqCautionMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
		return SUBSEQ_OBLIGATE_RECV_YESNO_INIT;
	}

	return SUBSEQ_CAUTION_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  強制送還をするか「はい・いいえ」
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvYesnoInit( PHCLINK_WORK *wk )
{
	// はい・いいえ初期化
	PhcLinkBmp_YesnoInit( wk, PHC_YESNO_NO );

	return SUBSEQ_OBLIGATE_RECV_YESNO_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  強制送還をするか「はい・いいえ｣待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvYesnoWait( PHCLINK_WORK *wk )
{
	switch(PhcLinkBmp_YesnoWait(wk)){
	case PHC_YESNO_YES:
		PhcLinkObj_CursorDisappear( wk );
		// 強制送還を継続
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
		GF_BGL_BmpWinOff( &wk->MainBmpWin[ PL_BMP_B_SEL_2_0 ] );
		GF_BGL_BmpWinOff( &wk->MainBmpWin[ PL_BMP_B_SEL_2_1 ] );
//		GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME1_M );
		GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );
		return SUBSEQ_OBLIGATE_RECV_MSG;
		break;
	case PHC_YESNO_NO:
		// タイトルへ
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 16, 32, 8, GF_BGL_SCRWRT_PALNL );
		GF_BGL_BmpWinOff( &wk->MainBmpWin[ PL_BMP_B_SEL_2_0 ] );
		GF_BGL_BmpWinOff( &wk->MainBmpWin[ PL_BMP_B_SEL_2_1 ] );
		PhcLinkObj_CursorDisappear( wk );
		wk->mainseq_next = MAINSEQ_START;
		return SUBSEQ_END;
		break;
	default:
		break;
	}

	return SUBSEQ_OBLIGATE_RECV_YESNO_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  「ポケモンを　おでかけから　きょうせてきにかえらせます」表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvMsg( PHCLINK_WORK *wk )
{
//	PhcLinkObj_PhcAppear( wk, 0 );


	// 「ポケモンを　おでかけから　きょうせいてきに」表示
	wk->MsgIndex = PhcLinkBmp_TalkWinPrint( wk, PL_BMP_B_MINITALK, phc_ds_msg_20 );
	return SUBSEQ_OBLIGATE_RECV_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  「ポケモンを　おでかけから　きょうせてきにかえらせます」表示待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
		return SUBSEQ_OBLIGATE_RECV_SELECT_INIT;
	}

	return SUBSEQ_OBLIGATE_RECV_MSG_WAIT;

}


//----------------------------------------------------------------------------------
/**
 * @brief  「ポケモンをかえらせる」選択開始
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvSelectInit( PHCLINK_WORK *wk )
{
	// １択ボタン
	PhcLink_BgGraphicSet( wk, GF_BGL_FRAME2_M, NARC_phc_ds_phcds_btn_d_lz_nscr );
	PhcLinkBmp_StrPrintColor_M( wk, PL_BMP_B_SEL_1, wk->SelectStr[ PL_STRING_OBLIGATE ],
						   FONT_TOUCH, PHCCOL_B_BLACK );
	PhcLinkBmp_CancelPrint( wk, PL_BMP_B_CANCEL );			// 「もどる」表示

	wk->cursor_pos = 0;
	PhcLinkObj_CursorPosAppearSet( wk, 2 );

	return SUBSEQ_OBLIGATE_RECV_SELECT_WAIT;
}


//----------------------------------------------------------------------------------
/**
 * @brief  「ポケモンをかえらせる」選択待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvSelectWait( PHCLINK_WORK *wk )
{
	u32 touch = PhcLink_GetTouchTrg( PHC_TOUCH_1_1_MODE );
	if(touch!=RECT_HIT_NONE){
		PhcLink_CursorAnimeStart( wk, touch, 2+touch, SUBSEQ_OBLIGATE_RECV_SELECT_ACTION );
		Snd_SePlay(SEQ_SE_DP_DECIDE);
		return SUBSEQ_CURSOR_ANIME_WAIT;
	}
	if(sys.trg&PAD_KEY_UP){
		PhcLinkObj_CursorPosAppearSet( wk, 2);
		if(wk->cursor_pos!=0){
			Snd_SePlay( SEQ_SE_DP_SELECT );
		}
		wk->cursor_pos = 0;
	}else if(sys.trg&PAD_KEY_DOWN){
		PhcLinkObj_CursorPosAppearSet( wk, 3);
		if(wk->cursor_pos!=1){
			Snd_SePlay( SEQ_SE_DP_SELECT );
		}
		wk->cursor_pos = 1;
	}else if(sys.trg&PAD_BUTTON_DECIDE){
		PhcLink_CursorAnimeStart( wk, wk->cursor_pos,
								  2+wk->cursor_pos,
								  SUBSEQ_OBLIGATE_RECV_SELECT_ACTION );
		Snd_SePlay(SEQ_SE_DP_DECIDE);
		return SUBSEQ_CURSOR_ANIME_WAIT;
	}else if(sys.trg&PAD_BUTTON_CANCEL){
		PhcLink_CursorAnimeStart( wk, 1, 3, SUBSEQ_OBLIGATE_RECV_SELECT_ACTION );
		Snd_SePlay(SEQ_SE_DP_SELECT);
		return SUBSEQ_CURSOR_ANIME_WAIT;
	}

	return SUBSEQ_OBLIGATE_RECV_SELECT_WAIT;
}



//----------------------------------------------------------------------------------
/**
 * @brief  強制復帰画面の選択肢実行
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int 	SubSeqObligateRecvSelectAction( PHCLINK_WORK *wk )
{
	// カーソルオフ
	PhcLinkObj_CursorDisappear( wk );

	if(wk->cursor_pos==0){
		// セーブデータのポケモンを復活させる
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
		GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME2_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
		GF_BGL_BmpWinOff( &wk->MainBmpWin[ PL_BMP_B_SEL_2_0 ] );
		GF_BGL_BmpWinOff( &wk->MainBmpWin[ PL_BMP_B_SEL_2_1 ] );
		GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME2_M );


// PHC476	PHCでPHC-Aを預けてから、PHC-Bを初期化→登録→戻す→自動生成
//          の後強制引取りをすると経験値が入る
#if GS_PHC476_20090707_FIX
		wk->step_difference = 0;
#endif

		return SUBSEQ_OBLIGATE_RECV_DEMO_CALL_MSG;
	}else{
		wk->mainseq_next = MAINSEQ_END_PHC;
	}
	return SUBSEQ_END;

}


//----------------------------------------------------------------------------------
/**
 * @brief  「○○もどってこい！」表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqObligateRecvDemoCallMsg( PHCLINK_WORK *wk )
{
	POKEMON_PASO_PARAM *ppp = (POKEMON_PASO_PARAM*)wk->pokepaso;
	u16 flag;

	PhcSvData_GetPokemon( wk->phc_svdata, (u8*)ppp );

	PhcLinkObj_PhcAppear( wk, 0 );

	// 正面絵画像転送
	WORDSET_RegisterPokeNickName( wk->wset, 1, ppp );
	PhcLink_TransPokeGra( ppp, wk->PokeGra, &wk->PokeGraSsa, 0 );


	PhcLink_MsgStart( wk, PL_BMP_B_TALK, phc_com_msg_03,
					  SUBSEQ_OBLIGATE_RECV_DEMO_INIT );

	return SUBSEQ_MSG_WAIT;
}

//----------------------------------------------------------------------------------
/**
 * @brief  戻ってくるデモ初期化
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqObligateRecvDemoInit( PHCLINK_WORK *wk )
{

	wk->time = 0;

	PhcLinkObj_Disappear( wk, PLOBJ_ID_POKEMON_D );


	return SUBSEQ_OBLIGATE_RECV_DEMO;
}


#define OBLIGATE_DEMO_TIME	( 180 )		///< 強制送還デモのかかるSYNC数

//----------------------------------------------------------------------------------
/**
 * @brief  戻ってくるデモ
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqObligateRecvDemo( PHCLINK_WORK *wk )
{
	wk->time++;
	if(wk->time> OBLIGATE_DEMO_TIME){
		// ポケモン表示
//		PhcLinkObj_Appear( wk, PLOBJ_ID_POKEMON_D );
		return SUBSEQ_OBLIGATE_RECV_DEMO_END;

	}
	if(wk->time > (gf_mtRand()%OBLIGATE_DEMO_TIME)){
		PhcLinkObj_DownLightObjBirth( wk );
	}
	_connect_se(wk->time);

	return SUBSEQ_OBLIGATE_RECV_DEMO;
}


//----------------------------------------------------------------------------------
/**
 * @brief  戻ってくるデモ終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqOBligateRecvDemoEnd( PHCLINK_WORK *wk )
{
	return SUBSEQ_OBLIGATE_RECV_DEMO_END_MSG;
}

//----------------------------------------------------------------------------------
/**
 * @brief  「○○○がもどってきた！」表示
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeq_ObligateRecvDemoEndMsg( PHCLINK_WORK *wk )
{
	PhcLink_MsgStart( wk, PL_BMP_B_TALK, phc_com_msg_04, SUBSEQ_MOVE_RECV_SAVE );
	return SUBSEQ_MSG_WAIT;
}


//=============================================================================================
/**
 * @brief  phclink_recvdemo.cに移行
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//=============================================================================================
static int SubSeqMoveRecvSave( PHCLINK_WORK *wk )
{
	wk->mainseq_next = MAINSEQ_RECV_DEMO;
	return SUBSEQ_END;
}

//----------------------------------------------------------------------------------
/**
 * @brief  終了フェードアウト(強制送還時のみ）
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqPokemonRunawayFadeOut( PHCLINK_WORK *wk )
{
	WIPE_SYS_Start(
		WIPE_PATTERN_WMS, WIPE_TYPE_FADEOUT, WIPE_TYPE_FADEOUT,
		WIPE_FADE_BLACK, WIPE_DEF_DIV, WIPE_DEF_SYNC, HEAPID_PHC_LINK );
	return SUBSEQ_POKEMON_RUNAWAY_FADEOUT_WAIT;

}

//----------------------------------------------------------------------------------
/**
 * @brief  終了フェードアウト待ち（強制送還時のみ）
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqPokemonRunawayFadeOutWait( PHCLINK_WORK *wk )
{
	if( WIPE_SYS_EndCheck() == TRUE ){

		// 白い玉消去
		PhcLinkObj_PokeLumpDisappear( wk );
		wk->mainseq_next = MAINSEQ_START;
		return SUBSEQ_END;
	}
	return SUBSEQ_POKEMON_RUNAWAY_FADEOUT_WAIT;

}







//----------------------------------------------------------------------------------
/**
 * @brief  会話ウインドウ表示終了待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqMsgWait( PHCLINK_WORK *wk )
{
	if(GF_MSG_PrintEndCheck( wk->MsgIndex )==0){
		wk->subseq = wk->subseq_next;
		return wk->subseq;
	}
	return SUBSEQ_MSG_WAIT;

}
//----------------------------------------------------------------------------------
/**
 * @brief  カーソルアニメ待ち
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//----------------------------------------------------------------------------------
static int SubSeqCursorAnimeWait( PHCLINK_WORK *wk )
{
	if(CATS_ObjectAnimeActiveCheckCap( wk->cap[PLOBJ_ID_CURSOR])==FALSE){
		PhcLinkObj_CursorDisappear( wk );	// カーソル非表示にする
		wk->subseq = wk->subseq_next;
		return wk->subseq;
	}
	return SUBSEQ_CURSOR_ANIME_WAIT;

}

//------------------------------------------------------------------
/**
 * @brief   送信・受信アプリ終了
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  int		次のシーケンス先
 */
//------------------------------------------------------------------
static int SubSeqEnd( PHCLINK_WORK *wk )
{
	PhcLinkObj_PhcDisappear( wk );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_L );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_ARROW_R );
	PhcLinkObj_Disappear( wk, PLOBJ_ID_POKEMON_D );

	GF_BGL_ScrFill(	wk->bgl, GF_BGL_FRAME1_M, 0x0000, 0, 0, 32, 24, GF_BGL_SCRWRT_PALNL );
	GF_BGL_LoadScreenReq( wk->bgl, GF_BGL_FRAME1_M );

	return SUBSEQ_MAX;
}

#ifdef PM_DEBUG


//------------------------------------------------------------------
/**
 * @brief   PHC受信データダンプ処理
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _dump_PHCData( PHCLINK_WORK *wk )
{
	int i,total=0;

	// 取得アイテム
	OS_Printf("get item = ");
	for(i=0;i<3;i++){
		OS_Printf("%d, ", wk->phcsys.Data.item[i].ID);
	}
	OS_Printf("\n");

	// PHC同士の通信で取得したどうぐ
	OS_Printf("get item = ");
	for(i=0;i<10;i++){
		OS_Printf("%d, ", wk->phcsys.Data.itemFriend[i].ID);
	}
	OS_Printf("\n");

	// 経過日数
	OS_Printf("endingTime = %d, ", 	wk->phcsys.Data.endingTime);
	OS_Printf("endingFlag = %d, ", 	wk->phcsys.Data.endingFlag);

	// ポケモン
	OS_Printf("pokemon0 id=%d, item =%d, level=%d\n", wk->phcsys.Data.pokemon[0].id,wk->phcsys.Data.pokemon[0].item,wk->phcsys.Data.pokemon[0].level);
	OS_Printf("pokemon1 id=%d, item =%d, level=%d\n", wk->phcsys.Data.pokemon[1].id,wk->phcsys.Data.pokemon[1].item,wk->phcsys.Data.pokemon[1].level);
	OS_Printf("pokemon2 id=%d, item =%d, level=%d\n", wk->phcsys.Data.pokemon[2].id,wk->phcsys.Data.pokemon[2].item,wk->phcsys.Data.pokemon[2].level);

	// 歩数
	OS_Printf("step week=\n");
	for(i=0;i<7;i++){
		OS_Printf("      %d: %d\n", i, wk->phcsys.Data.stepWeek[i]);
		total += wk->phcsys.Data.stepWeek[i];
	}
	OS_Printf(" total: %d\n ", total);

	OS_Printf("FullStep = %d\n ", wk->phcsys.myStatusPHC.totalStep);
}


//------------------------------------------------------------------
/**
 * @brief   PHC結果データの内容確認
 *
 * @param   wk		PHC画面ワーク
 *
 * @retval  none
 */
//------------------------------------------------------------------
static void _dump_PHCStatus( PHCLINK_WORK *wk )
{
	OS_Printf("coutry = %d\n", wk->phcsys.myStatusPHC.country );

	OS_Printf("romVersion = %d\n", wk->phcsys.myStatusPHC.romVersion );
	OS_Printf("trainerId = %d\n", wk->phcsys.myStatusPHC.trainerId );

	OS_Printf("entryFlag = %d\n", wk->phcsys.myStatusPHC.entryFlag );
	OS_Printf("pokeFlag = %d\n", wk->phcsys.myStatusPHC.pokeFlag );
	OS_Printf("pokeAutoGenerateFlag = %d\n", wk->phcsys.myStatusPHC.pokeAutoGenerateFlag );
	OS_Printf("totalStep=%d\n", wk->phcsys.myStatusPHC.totalStep);



}
#endif